gpt4 book ai didi

c# - 从 C# 调用 Clarion DLL

转载 作者:行者123 更新时间:2023-11-30 12:32:54 26 4
gpt4 key购买 nike

我目前在一家 IT 公司工作。他们使用 Clarion 制作软件,在该软件中,他们有一个 DLL,可以从他们的数据库中重新计算很多值。我需要从我的 C# 项目中调用此 DLL。我尝试了一切,但没有成功。

我的代码如下:

public partial class Form1 : Form
{
[DllImport("EPNORM.dll", EntryPoint = "MyRecalcualate@FlOUcOUcOsbOUc")]
public static extern void MyRecalcualate(System.Int64 myPtr, System.Int64 myLong, CWByte myByte);

[DllImport("User32.dll")]
public static extern Boolean MessageBeep(UInt32 beepType);

public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
System.Int64 myPtrTemp = 1234;
System.Int64 myLongTemp = 5678;
System.Byte myByteTemp = 88;

try
{
MyRecalcualate(myPtrTemp, myLongTemp, myByteTemp);
bool messagebeep = MessageBeep(1);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
MessageBox.Show("Successful");
}
}
}

问题是当我用断点调用它时,它只是消失在 MyRecalcuate 方法中并在 2 秒后到达 finally block 并重新显示而不做任何事情动态链接库。这是因为我需要修复 DLL 方法中的某些内容还是因为我调用错误?

下面调用的参数是:MyRecalculate(LONG, LONG, BYTE)

MyRecalcualate      PROCEDURE (MyStringPtr, MyLong, MyByte) ! Declare Procedure
LOC:CString CSTRING(255)
LOC:Byte BYTE
CODE
! clear completely LOC:CString with null values
LOC:CString = ALL('<0>', SIZE(LOC:CString))

! load string value, byte by byte, from memory address passed (MyStringPtr) and put into LOC:CString
I# = 0
LOOP
PEEK(MyStringPtr + I# , LOC:Byte)
IF LOC:Byte = 0 THEN BREAK END
LOC:CString[I# + 1] = CHR(LOC:Byte)
I# += 1
END

MESSAGE('MyString value is:||' & CLIP(LOC:CString))
MESSAGE('MyLong value is:||' & MyLong)
MESSAGE('MyByte value is :||' & MyByte)

这是他们的签约开发人员寄给我的截图,其中包含参数以及他如何在 VB.NET 中调用它:VB.NET 代码:http://imageshack.us/photo/my-images/269/callfromvisualbasictocl.jpg/CLARION 中的参数:http://imageshack.us/photo/my-images/100/asdxg.jpg/

最佳答案

第一个参数是指向空终止字符串的指针。您不能只传递一个随机的 Int64 值。所以你的 pinvoke 应该是这样的:

[DllImport("EPNORM.dll", EntryPoint = "MyRecalcualate@FlOUcOUcOsbOUc")]
public static extern void MyRecalcualate(string myPtr, int myInt, byte myByte);

我认为第二个参数 Clarion LONG 是一个 32 位整数。所以 int 在 C# 端。更重要的是,您需要仔细检查 Clarion 端的调用约定。你确定你的 C# 使用的是 stdcall 吗?

关于c# - 从 C# 调用 Clarion DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10616672/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com