2

如何将此 Clarion 过程声明转换为 C#?它是用 C 语言编写的第 3 方 DLL 的一部分,没有太多文档。我已经列出了 Clarion 中正常工作的方法的原型。在 C# 中,我不确定要使用什么类型来替换*CString. 我char[]像@DanielC 建议的那样尝试过,但是没有用。我还发现 Clarionlong是 32 位的(感谢 @shf301)。

号角:

SendRequest Procedure(*CString xData,Long DataLen,Long xTimeout),Byte,Virtual

C#(我尝试过,但不起作用):

[DllImport("3RD_PARTY_API.dll")]
private static extern long SendRequest(ref string xData, int DataLen, int xTimeout);

SendRequest当我在 C# 中调用该方法时,我得到了来自 VS2010的标准PInvokeStackImbalance 被检测到错误。我认为这是参数类型的问题,而不是类似于CharSetEntryPointDllImport 声明中的问题。我真的只是坚持如何转换*CString为有效的 C# 类型。

4

4 回答 4

6

我找到了答案。我希望我仍然与编写此代码的开发人员一起工作,这样我就可以对他们大喊大叫了。他们在 API 周围放置了一个包装器,这样我列出的带有 3 个参数的方法就可以在没有超时值的情况下调用实际的 API。PInvokeStackImbalance 异常来自我添加了一个额外参数的事实。

这是实际的 Clarion 程序以及正确的 C# 语法:

号角:

SendRequest Procedure(*CString xData, Long DataLen), Byte, Virtual

C#:

[DllImport("NOVA_API.dll", EntryPoint = "SendRequest")]
private static extern byte SendRequest(string xData, int DataLen);

总之,Clarion*CString可以string在 DLLImport 声明中转换为 .NET 类型。

非常感谢那些回复的人。这是我在搜索中使用的另一个资源,我发现它非常有用:pinvoke.net

于 2012-10-30T17:53:01.737 回答
4

在 C# 中,along始终是 64 位。在LongClarion 中是 32 位。long将 p/Invoke 声明中的参数更改为int's.

于 2012-10-29T23:35:23.037 回答
2

根据维基百科,clarion 可以使用一些奇怪的 TopSpeed “双快速调用”,他们使用 4 个 reg 作为参数而不是两个。如果使用此调用约定编译代码,则无法直接从 C# 调用。

TopSpeed / Clarion / JPI 前四个整数参数在寄存器 eax、ebx、ecx 和 edx 中传递。浮点参数在浮点堆栈上传递——寄存器 st0、st1、st2、st3、st4、st5 和 st6。结构参数总是在堆栈上传递。寄存器用完后,附加参数在堆栈上传递。eax 中返回整数值,edx 中返回指针,st0 中返回浮点类型。

如果不是这种情况,那么您的参数之一可能不是正确的大小,否则您将获得 AV 而不是损坏的堆栈错误。

也可以尝试在 dllimport 上设置调用约定。除了 "TOPSPEED" clarion 还支持 stdcall 和 cdecl 但 "TOPSPEED" 是默认值。以下是与 vb6 和 clarion 进行互操作的教程的链接。

http://pisoft.ru/verstak/insider/cw_vb.htm

于 2012-10-30T11:27:23.987 回答
1

你试过char[]吗?我不确定它是否会起作用,但值得一试。(我会将此作为评论发布,但我没有权利)

于 2012-10-29T22:14:12.070 回答