首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从C#调用Clarion DLL

从C#调用Clarion DLL
EN

Stack Overflow用户
提问于 2012-05-16 18:29:06
回答 1查看 1.6K关注 0票数 4

我目前在一家IT公司工作。他们使用Clarion制作了他们的软件,在这个软件中,他们有一个DLL,可以从数据库中重新计算很多值。我需要从我的C#项目中调用这个DLL。我试过所有的方法,但都没起作用。

我的代码如下:

代码语言:javascript
复制
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)

代码语言:javascript
复制
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/参数中调用它:http://imageshack.us/photo/my-images/100/asdxg.jpg/

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-16 21:11:00

第一个参数是指向以null结尾的字符串的指针。您不能只传递一个随机的Int64值。因此,您的pinvoke应该如下所示:

代码语言:javascript
复制
[DllImport("EPNORM.dll", EntryPoint = "MyRecalcualate@FlOUcOUcOsbOUc")]
public static extern void MyRecalcualate(string myPtr, int myInt, byte myByte);

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10616672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档