关于dll返回字符串在C#下调用的问题

bakerwhy bakerwhy 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
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()始终不能得到正确结果。

这个问题困扰我两天了,先谢谢大家了:-)
...全文

相关推荐

评论 8
收藏 已收藏
分享
返回顶部
bakerwhy
C# 111,129 成员 642,539 内容