调用dll,ref参数无法返回!

ben988211 2009-04-28 08:06:46
源:
LONG PASCAL ReadTime(HANDLE hCom,BYTE DevNo,LPSTR pTime)

C#:
[DllImport("ca210.dll")]
public static extern Int32 ReadTime(Int32 hCom, byte DevNo, ref string pTime);

调用:
ReadTime(hCom, 0, ref ptr)

得不到ref参数返回值,程序总是异常退出。(C++调用正常,可以得到值)

ref参数数据类型尝试使用char、byte都一样的效果。ref换成out也是。
请各位帮忙解决 一下!!!!
...全文
145 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
readfuture 2009-04-29
  • 打赏
  • 举报
回复
友情帮顶
ben988211 2009-04-29
  • 打赏
  • 举报
回复
解决了!

[DllImport("ca210.dll")]
public static extern Int32 ReadTime(Int32 hCom, byte DevNo, ref byte pTime);

byte[] pTime = new byte[14];
CA210.ReadTime(hCom, 0, ref pTime[0]);


不过还是不明白为啥用string或者stringbuilder就是出问题。
用[MarshalAs(UnmanagedType.LPStr)] 也出问题。
wartim 2009-04-29
  • 打赏
  • 举报
回复
        [DllImport("ca210.dll")]
public static extern Int32 ReadTime(Int32 hCom, byte DevNo, [MarshalAs(UnmanagedType.LPStr)] String pTime);
usuafox 2009-04-28
  • 打赏
  • 举报
回复
同意findcaiyzh,用String应该就可以了。
宝_爸 2009-04-28
  • 打赏
  • 举报
回复
另外要注意,直接返回C段的指针是不对的.
extern "C" __declspec(dllexport) char* getData();

char DATA[1000];
double tmp;

char* getData()
{
tmp= 0.55;
sprintf(DATA, "%f", tmp);
return DATA;
}

解决方案:
把一个const char [] 作为指针返回了 ,这是一个不好的做法,
其次.net下你用string 封送 ,框架会把值赋给revStr以后 ,会试图释放这个指针,结果出现了意想不到的情况。
做好的做法是传入char* 引用,或者
在c++dll里
tmp= 0.55;
sprintf(DATA, "%f", tmp);
return _strdup(DATA);
宝_爸 2009-04-28
  • 打赏
  • 举报
回复
这个专门讲string的.
http://msdn.microsoft.com/en-us/library/e8w969hb.aspx
宝_爸 2009-04-28
  • 打赏
  • 举报
回复
直接使用String试一试.

参考这里的表:
http://msdn.microsoft.com/en-us/library/ac7ay120.aspx
RFEZGC 2009-04-28
  • 打赏
  • 举报
回复
string 可是引用类型,有没看MSDN的声明?CLASS STRING
在C#引用类型跟自然C++的指针一样,包含对地址的一级引用

LPSTR 不就是CHAR*==C#的string
你要是加上ref就等于C++的CHAR**
kingtiy 2009-04-28
  • 打赏
  • 举报
回复
ref string pTime
这里应该是传个string类型的参数呢。

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧