调用动态库出现问题,PChar类型的值怎么转换到C#中???

freehul 2005-05-16 03:42:57
原型:
GetTAErrMsg 获取错误信息。
function GetTAErrMsg (ErrNo:integer;p1:PChar): Boolean;
参数
ErrNo 错误号码。
p1 用于返回错误信息。调用前必须先开辟足够的空间。
___________________________________________________________________

[DllImport("TerAccDll.dll", EntryPoint="GetTAErrMsg")]
public static extern bool GetTAErrMsg (int ErrNo,out string p1);

调用产生异常:
string ErrMsg;
bool b=GetTAErrMsg (1008,out ErrMsg);

求教高手,TerAccDll.dll是厂家提供的DLL,我要怎样才能得到ErrMsg???
...全文
368 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
freehul 2005-05-17
  • 打赏
  • 举报
回复
.net默认为Unicode编码,需要显式设置CharSet = CharSet.Ansi:

[DllImport("TerAccDll.dll", CharSet = CharSet.Ansi)]
public static extern bool GetTAErrMsg (int ErrNo, StringBuilder p1);

调用:
StringBuilder ErrMsg=new StringBuilder(255);;
bool b=GetTAErrMsg (1008, ErrMsg);

不需要定义为out声明。


这样就OK,多谢各位的帮助
losthold 2005-05-17
  • 打赏
  • 举报
回复
看看有没有高手能解决这个问题?
losthold 2005-05-17
  • 打赏
  • 举报
回复
我现在也遇到这个问题了,在Win2000下一切正常
但是在WinXP下有一个函数调用时就提示未将对象引用设置到对象实例
我的dll有4个函数,其他3个都遇到没问题
wolf223 2005-05-17
  • 打赏
  • 举报
回复
用StringBuilder 应该是可以的,我试过是可以的。你看一下指定其他属性,如CharSet:
[DllImport("TerAccDll.dll", EntryPoint="GetTAErrMsg",CallingConvention = CallingConvention.Cdecl ,CharSet=CharSet.Ansi)]
public static extern bool GetTAErrMsg (int ErrNo,StringBuilder sb);

调用的时候StringBuilder sb = new StringBuilder(1000);
losthold 2005-05-17
  • 打赏
  • 举报
回复
是不是XP操作系统?
freehul 2005-05-16
  • 打赏
  • 举报
回复
未将对象引用设置到对象的实例
bool b=GetTAErrMsg (1008,out ErrMsg);
这句话报错!!!!
不管我是用System.String,StringBuilder还是byte[],用ref也试过,晕啊...真不知道问题出在什么地方...
虽然不行,不过还是谢谢各位帮顶和出主意的朋友
losthold 2005-05-16
  • 打赏
  • 举报
回复
[DllImport("TerAccDll.dll", EntryPoint="GetTAErrMsg")]
public static extern bool GetTAErrMsg (int ErrNo,out byte[] p1);

byte[] ErrMsg = new byte[256];
bool b=GetTAErrMsg (1008,out ErrMsg);
string sMsg = System.Text.Encoding.ASCII.GetString(ErrMsg,0,256);

试试看把
bumm 2005-05-16
  • 打赏
  • 举报
回复
帮你顶一下
freehul 2005-05-16
  • 打赏
  • 举报
回复
顶者有分啊....人都去哪了??
freehul 2005-05-16
  • 打赏
  • 举报
回复
StringBuilder试过,不行........有没有别的建议呢?
losthold 2005-05-16
  • 打赏
  • 举报
回复
作为输出参数最好使用StringBuilder,
你可以试试将string ErrMsg 改为 StringBuiler ErrMsg = new StringBuilder(256)
其中StringBuilder长度你可以参考dll的说明文档或者原始声明,只要返回的错误信息
不超过这个长度即可。
sharry_ye 2005-05-16
  • 打赏
  • 举报
回复
~up~
good_luck898 2005-05-16
  • 打赏
  • 举报
回复
UP
wq_sc 2005-05-16
  • 打赏
  • 举报
回复
学习,帮顶.
pingnt 2005-05-16
  • 打赏
  • 举报
回复
关注...
shuaizhen 2005-05-16
  • 打赏
  • 举报
回复
学习ing

110,534

社区成员

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

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

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