C#调用delphi动态库返回值乱码

Illusion_1202 2017-04-26 03:52:24
手上有一个delphi的dll和一个接口说明文档,需要在C#项目中调用delphi库中的方法,使用DllImport的方式将库导入了,但调用时返回一堆乱码……问题有点多,首先,不太清楚C#中对应的方法签名该怎么写,举例来说,delphi接口文档中这样写的方法:

C#对应的应该是
private static extern string ini_sys(string hpCode);
还是
private static extern int ini_sys(string hpCode, out string hpAreacode, out string hpLevel, out string Hpclass, out string hpName, out string moneyLevel, out string Err_text);
亦或是
private static extern int ini_sys(string hpCode, ref string hpAreacode, ref string hpLevel, ref string Hpclass, ref string hpName, ref string moneyLevel, ref string Err_text);
请各位前辈赐教
...全文
690 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Illusion_1202 2017-04-28
  • 打赏
  • 举报
回复
引用 10 楼 stherix 的回复:
[quote=引用 9 楼 Illusion_1202 的回复:] [quote=引用 7 楼 stherix 的回复:] 同时输入输出的参数用ref
我用了ref签名好像还是不对,不过这时候错误信息变成了 ”PInvokeStackImbalance error CS0103: 当前上下文中不存在名称“$exception”“[/quote] 这是调用函数的时候 参数总长度不对 应该还是签名不对的问题,所以还不知道到底有几个参数 另外,如果delphi函数声明不是stdcall而是默认的fastcall的话,c#是没法调用的[/quote] 可是我拿到的文档上就只有那七个参数,应该是可以调用的,因为有人用其他语言开发过,,,可不可以反编译看看里面到底是什么样的
stherix 2017-04-28
  • 打赏
  • 举报
回复
引用 9 楼 Illusion_1202 的回复:
[quote=引用 7 楼 stherix 的回复:] 同时输入输出的参数用ref
我用了ref签名好像还是不对,不过这时候错误信息变成了 ”PInvokeStackImbalance error CS0103: 当前上下文中不存在名称“$exception”“[/quote] 这是调用函数的时候 参数总长度不对 应该还是签名不对的问题,所以还不知道到底有几个参数 另外,如果delphi函数声明不是stdcall而是默认的fastcall的话,c#是没法调用的
Illusion_1202 2017-04-28
  • 打赏
  • 举报
回复
引用 7 楼 stherix 的回复:
同时输入输出的参数用ref
我用了ref签名好像还是不对,不过这时候错误信息变成了 ”PInvokeStackImbalance error CS0103: 当前上下文中不存在名称“$exception”“
Illusion_1202 2017-04-27
  • 打赏
  • 举报
回复
我去掉第一个字节还是乱码……这是个有点老的库了,应该是delphi2009之前,默认用的应该是delphi anti string吗
stherix 2017-04-27
  • 打赏
  • 举报
回复
同时输入输出的参数用ref
Illusion_1202 2017-04-27
  • 打赏
  • 举报
回复
引用 5 楼 stherix 的回复:
[quote=引用 4 楼 Illusion_1202 的回复:] [quote=引用 3 楼 stherix 的回复:] delphi的string格式是特有的 所以基本没法调用 而且他的文档也写得不明不白 估计是类似第三个那样,和第二个也没区别,因为ref和out在dll调用的时候行为是一样的
delphi的string格式特有是指它特别在什么地方呢,应该不会无法调用吧,而且我现在是行也得行不行也得行的状态……[/quote] delphi字符串第一个字节是字符串的长度(pascal继承过来的已被弃用,因为现在字符串可以超过255字符) 后面的才是字符串真正的内容 你可以用byte[]然后去尝试解析看看 一般delphi写dll都要用PChar而非string,做这样dll的人都是天使[/quote] 原来如此!我说怎么试编所有编码集都是乱码,顺便请问下,像我这个例子中hpCode这种既是输入参数又是输出参数的怎么写c#签名?我现在的写法他报“托管的pinvoke签名与非托管的目标签名不匹配”的错误
stherix 2017-04-27
  • 打赏
  • 举报
回复
引用 4 楼 Illusion_1202 的回复:
[quote=引用 3 楼 stherix 的回复:] delphi的string格式是特有的 所以基本没法调用 而且他的文档也写得不明不白 估计是类似第三个那样,和第二个也没区别,因为ref和out在dll调用的时候行为是一样的
delphi的string格式特有是指它特别在什么地方呢,应该不会无法调用吧,而且我现在是行也得行不行也得行的状态……[/quote] delphi字符串第一个字节是字符串的长度(pascal继承过来的已被弃用,因为现在字符串可以超过255字符) 后面的才是字符串真正的内容 你可以用byte[]然后去尝试解析看看 一般delphi写dll都要用PChar而非string,做这样dll的人都是天使
Illusion_1202 2017-04-27
  • 打赏
  • 举报
回复
引用 3 楼 stherix 的回复:
delphi的string格式是特有的 所以基本没法调用 而且他的文档也写得不明不白 估计是类似第三个那样,和第二个也没区别,因为ref和out在dll调用的时候行为是一样的
delphi的string格式特有是指它特别在什么地方呢,应该不会无法调用吧,而且我现在是行也得行不行也得行的状态……
stherix 2017-04-27
  • 打赏
  • 举报
回复
delphi的string格式是特有的 所以基本没法调用 而且他的文档也写得不明不白 估计是类似第三个那样,和第二个也没区别,因为ref和out在dll调用的时候行为是一样的
Illusion_1202 2017-04-27
  • 打赏
  • 举报
回复
继续顶…………
Illusion_1202 2017-04-26
  • 打赏
  • 举报
回复
没人吗?不要沉啊 ……

12,162

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 Web Services
社区管理员
  • Web Services社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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