关于dll返回字符串在C#下调用的问题
c++dll导出函数的原型:
extern "C" __declspec(dllexport) void say(void);
extern "C" __declspec(dllexport) LPTSTR Picker();
我开始这样在c#中调用
[DllImport("..\\mfcdll\\mfcdll.dll", EntryPoint = "say")]
public static extern void say();
[DllImport("..\\mfcdll\\mfcdll.dll", EntryPoint = "Picker")]
public static extern string Picker();
.........
say(); //ok!
string str = Picker();
MessageBox.Show(str); //error:display empty comment
........
我又在网上查找一些资料,有说用StringBuilder可以解决,我又用以下方法:
[DllImport("..\\mfcdll\\mfcdll.dll", EntryPoint = "Picker")]
public static extern StringBuilder Picker();
.........
say(); //ok!
StringBuilder sb = new StringBuilder();
sb = Picker();
MessageBox.Show(sb.ToString()); //error:出现异常并退出
........
因为我接触c#时间不长,也没有去仔细看StringBuilder的文档,我也不知道以上用法是否正确
最后我又换了以下方法
[StructLayout(LayoutKind.Sequential,CharSet = CharSet.Unicode)]
public struct MyString
{
public IntPtr _str;
}
[DllImport("..\\mfcdll\\mfcdll.dll", EntryPoint = "Picker")]
public extern static void marshalFun(IntPtr ip);
........
IntPtr ip = Marshal.AllocHGlobal(128);
marshalFun(ip);
MyString mystr = (MyString)Marshal.PtrToStructure(ip, typeof(MyString));
string str = Marshal.PtrToStringUni(mystr._str);
MessageBox.Show(str); //此处任然显示空
Marshal.FreeHGlobal ;
.......
dll文件应该没有问题,在vc.net 2005 + WM5 SDK中使用正常,而在C#下调用时,第一个导出函数say()调用正常,而第二个函数picker()始终不能得到正确结果。
这个问题困扰我两天了,先谢谢大家了:-)
extern "C" __declspec(dllexport) void say(void);
extern "C" __declspec(dllexport) LPTSTR Picker();
我开始这样在c#中调用
[DllImport("..\\mfcdll\\mfcdll.dll", EntryPoint = "say")]
public static extern void say();
[DllImport("..\\mfcdll\\mfcdll.dll", EntryPoint = "Picker")]
public static extern string Picker();
.........
say(); //ok!
string str = Picker();
MessageBox.Show(str); //error:display empty comment
........
我又在网上查找一些资料,有说用StringBuilder可以解决,我又用以下方法:
[DllImport("..\\mfcdll\\mfcdll.dll", EntryPoint = "Picker")]
public static extern StringBuilder Picker();
.........
say(); //ok!
StringBuilder sb = new StringBuilder();
sb = Picker();
MessageBox.Show(sb.ToString()); //error:出现异常并退出
........
因为我接触c#时间不长,也没有去仔细看StringBuilder的文档,我也不知道以上用法是否正确
最后我又换了以下方法
[StructLayout(LayoutKind.Sequential,CharSet = CharSet.Unicode)]
public struct MyString
{
public IntPtr _str;
}
[DllImport("..\\mfcdll\\mfcdll.dll", EntryPoint = "Picker")]
public extern static void marshalFun(IntPtr ip);
........
IntPtr ip = Marshal.AllocHGlobal(128);
marshalFun(ip);
MyString mystr = (MyString)Marshal.PtrToStructure(ip, typeof(MyString));
string str = Marshal.PtrToStringUni(mystr._str);
MessageBox.Show(str); //此处任然显示空
Marshal.FreeHGlobal ;
.......
dll文件应该没有问题,在vc.net 2005 + WM5 SDK中使用正常,而在C#下调用时,第一个导出函数say()调用正常,而第二个函数picker()始终不能得到正确结果。
这个问题困扰我两天了,先谢谢大家了:-)
...全文
相关推荐
C#调用C++编写的DLL函数各种参数传递问题
1. 不返回值的参数 C++ 原型: bool SendNewSms(char *szTel, char *szMessage); C#引用; [DllImport( CdmaCard.dll,EntryPoint=SendNewSms)] public static extern bool SendNewSms(string phone,string msg); 2. 带返回值(char *) C++原型: BOOL GetCardErrorMessage(char *szErrorMessage , int
c# 调用C++编写 的DLL函数各种参数传递问题。
c# 调用C++编写 的DLL函数各种参数传递问题。数据处理问题等等。
c#调用c++ dll 传参 string 崩溃的一种解决办法
c#调用c++ dll 传参 string 崩溃的一种解决办法
C#调用C++ dll 传入字符参数
C#调用C++ dll 传入字符参数,基础版本, http://blog.csdn.net/dlmuxgyang/article/details/8508252
C#调用C/C++ Dll中函数实例代码
实例代码说明如何在托管的C#代码中调用非托管的Win32 API或者自己用C/C++写的Dll中的函数,以及如何传递输入、输出字符串参数,结构类型参数等问题。


