我目前正在一家IT公司工作。他們使用Clarion, 製作了他們的軟件,並且在那個軟件中他們有一個DLL,它從他們的數據庫重新計算了很多值。我需要從我的C#項目調用這個DLL。我嘗試了一切,沒有它的工作。從C調用Clarion DLL#
我的代碼如下:
public partial class Form1 : Form
{
[DllImport("EPNORM.dll", EntryPoint = "[email protected]")]
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(很長很長,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/
你能否提供這個Clarion庫的更多信息?它在我看來,你正在傳遞的參數有問題。 – Dimitris
hey dimitris我更新了我的帖子,其中包含了號角端代碼 – Mrlondon7100
您是否有任何訪問這些函數的C/C++示例? –