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" ステートメントはターゲット プラットフォームでサポートされていません。無視しました。