Calling Clarion DLL from C#

本文关键字:from DLL Clarion Calling | 更新日期: 2023-09-27 18:34:24

我目前在一家IT公司工作。他们使用歌乐制作软件,在该软件中,他们有一个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");
        }
    }
}

问题是当我使用断点调用它时,它只是消失在 MyRecalcualate 方法中并在 2 秒后到达finallly块并重新显示,而无需从 DLL 执行任何操作。这是因为我需要修复 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/歌乐参数:

Calling Clarion DLL from C#

http://imageshack.us/photo/my-images/100/asdxg.jpg/

第一个参数是指向以 null 结尾的字符串的指针。不能只传递随机Int64值。所以你的 pinvoke 应该看起来像这样:

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

我相信第二个参数,号角LONG,是一个 32 位整数。所以int在 C# 方面。更重要的是,您需要仔细检查号角端的调用约定。你确定它是stdcall哪个是你的 C# 使用的吗?