🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
DLL

DLL(Dynamic Link Library)とは、他のモジュールからも使用する事が出来る、関数とデータが格納されているモジュールのことです。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

1回答

2679閲覧

C# にてvoid GetString(char *str); という型のdllの関数を使って文字列を取得したい。char *をstringに変換したいです。

退会済みユーザー

退会済みユーザー

総合スコア0

DLL

DLL(Dynamic Link Library)とは、他のモジュールからも使用する事が出来る、関数とデータが格納されているモジュールのことです。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/02/22 14:39

編集2021/02/23 02:19

C# にてvoid GetString(char *str); という型のdllの関数を使って文字列を取得したいです。
取得したchar *をstringに変換したいです。

C++

1extern "C" __declspec(dllexport) void __stdcall GetString(char* str);

C#

1 [DllImport("test.dll", CallingConvention = CallingConvention.StdCall)] 2 private static extern void GetString(IntPtr str); 3 4 private void button1_Click(object sender, EventArgs e) 5 { 6 IntPtr str = Marshal.AllocHGlobal(1024); 7 GetString(str); 8 string msg = Marshal.PtrToStringAnsi(str); 9 MessageBox.Show(msg); 10 Marshal.FreeHGlobal(str); 11 }

↑これであってますか?

作り直しました。
↓これであってますか?

C++

1// .def 2LIBRARY 3 "GetString" 4EXPORTS 5 GetString 6 7// .h 8#pragma once 9extern "C" __declspec(dllexport) int __stdcall GetString(char* lpString, int bufSize); 10 11// .cpp 12#include "pch.h" 13#include <string.h> // for strcpy_s 14#include <stdlib.h> // for _countof 15#include "GetString.h" 16 17extern "C" __declspec(dllexport) int __stdcall GetString(char* lpString, int bufSize) 18{ 19 char string[] = { "長い文字列" }; 20 if (bufSize > _countof(string)) 21 { 22 strcpy_s(lpString, _countof(string), string); 23 return 1; 24 } 25 else 26 { 27 memcpy_s(lpString, bufSize, string, bufSize); 28 lpString[bufSize] = 0;// 強制的に切ってNULL終端文字列として返す。 29 return 0; 30 } 31}

C#

1using System; 2using System.Runtime.InteropServices; 3using System.Windows.Forms; 4 5namespace ShowString 6{ 7 public partial class Form1 : Form 8 { 9 const int BUF_SIZE = 3; 10 11 public Form1() 12 { 13 InitializeComponent(); 14 } 15 16 [DllImport("GetString.dll", CallingConvention = CallingConvention.StdCall)] 17 private static extern int GetString(IntPtr lpString, int bufSize); 18 19 private void button1_Click(object sender, EventArgs e) 20 { 21 IntPtr lpString = Marshal.AllocHGlobal(BUF_SIZE); 22 if (GetString(lpString, BUF_SIZE) == 1) 23 { 24 string msg = Marshal.PtrToStringAnsi(lpString); 25 MessageBox.Show("長い文字列は「" + msg + "」です。"); 26 } 27 else 28 { 29 string msg = Marshal.PtrToStringAnsi(lpString); 30 MessageBox.Show("文字列が長すぎます。途中で切りました。" 31 + Environment.NewLine + "長い文字列は「" + msg + "」になってしまいました。"); 32 } 33 Marshal.FreeHGlobal(lpString); 34 } 35 } 36}

↓こんな警告が出ます。無視していいですか?
warning LNK4017: "GetString" ステートメントはターゲット プラットフォームでサポートされていません。無視しました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2021/02/22 14:59

またお前か。 知ってる人なら即答できる例題は要らない。
退会済みユーザー

退会済みユーザー

2021/02/23 02:16

これ、ググって出てくるサンプル酷すぎるのばっかりだったので、要点をまとめてみました。
Zuishin

2021/02/23 02:21

まとまってないし、オレオレソフトのシグネチャなどそもそも要らん。
退会済みユーザー

退会済みユーザー

2021/02/23 02:38

こーゆーのはQiitaに投稿すればいい?
Zuishin

2021/02/23 02:45

わざわざ IntPtr を使うようなのは広告の裏で十分。
退会済みユーザー

退会済みユーザー

2021/02/23 03:04

20年前に作った資産を生かすには必須です。
Zuishin

2021/02/23 03:14

必須ではない。もっといいマーシャリングできるからググれ。
退会済みユーザー

退会済みユーザー

2021/02/23 03:54

マーシャリング?
退会済みユーザー

退会済みユーザー

2021/02/23 04:08

一応かなりググって辿り着いた結論が冒頭のシンプルなやつなんだけど。 1つ付いてる回答みたいなエラー処理は良いとして、それ以外でdll側に手を入れるような酷いサンプルは論外。
Zuishin

2021/02/23 04:09

手を入れなくてできるからググれ。レベル低い私でも数秒で見つけられるんだからレベル高いお前なら楽勝だろ。
guest

回答1

0

C++側のGetStringでは、第一引数strが指し示す領域の大きさを知るすべがなく、バッファーオーバーランの可能性があり安全では有りません。書き込んでもらう領域を用意してポインタで渡す場合は領域の大きさも引数で同時に渡せなければなりません。

つまり設計から破綻してるので出直してください。

投稿2021/02/22 21:52

yumetodo

総合スコア5852

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問