当前位置:编程学习 > wap >>

关于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()始终不能得到正确结果。 

这个问题困扰我两天了,先谢谢大家了:-) 
--------------------编程问答-------------------- 自己顶 --------------------编程问答-------------------- 已经解决。http://community.csdn.net/Expert/topic/5404/5404313.xml?temp=.6478998
补充:移动开发 ,  Windows Phone
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,