2011-07-14 139 views
2

隨着編譯的Delphi DLL,申報的功能之一是德爾福DLL函數的C#

MYDLL.DLL

type 
TInfo = array [0..255] of byte; 

type 
public 
    function GetInfo(Memadr, Infolen: Integer): TInfo; 

是什麼在C#中使用這個格式的DllImport?

+4

好像你從更高的層次聲明,可能是一個類聲明中提取的函數聲明瞭。我懷疑這是因爲掛着「類型」和「公共」字樣。瞭解適當的導入定義非常重要。 –

+0

檢查此鏈接: [調用從C#代碼一個Delphi DLL方法](http://stackoverflow.com/questions/2200521/calling-a-delphi-dll-method-from-c-code) –

回答

4

我會做這樣的:

德爾福

type 
    TInfo = array [0..255] of byte; 

procedure GetInfo(Memadr, Infolen: Integer; var Result: TInfo); stdcall; 

C#

[DllImport(@"testlib.dll")] 
static extern void GetInfo(int Memadr, int Infolen, byte[] result); 

static void Main(string[] args) 
{ 
    byte[] result = new byte[256]; 
    GetInfo(0, result.Length, result); 
    foreach (byte b in result) 
     Console.WriteLine(b); 
} 

你需要得到調用約定相匹配。我已經購買了stdcall這是P/invoke的默認值(這就是爲什麼它沒有在P/invoke簽名中指定的原因)。

我會避免返回數組作爲函數的返回值。以這種方式將它作爲參數進行編組比較容易。

事實上,在一般情況下,如果你想從固定大小的緩衝區遠,你可以做這樣的:

德爾福

procedure GetInfo(Memadr, Infolen: Integer; Buffer: PByte); stdcall; 

然後,填寫緩衝區,你」 d需要使用一些指針算術或其他等價物。

+0

+ 1然而...... OP可能實際上試圖導出「對象的過程」並將其稱爲過程。 (爲什麼他會把公共關鍵字放在他的方法簽名之上?)。 –

+0

@Warren由於無法導出Delphi對象,因此無法導出「對象過程」。要導出一個OOP接口,您需要查看COM或不透明的句柄以查看對象引用。 –

+0

當然你不能,而且我知道,但我不知道OP的「示例代碼」中的「公共」是在試圖告訴我們......在頂級單位範圍內,public並不是有效的關鍵字。這表示OP混淆。 –

0

需要在我原來的職位,以糾正錯誤,

type 
TInfo = array [0..255] of byte; 

implementation 
function GetInfo(Memadr, Infolen: Integer): TInfo; 


procedure TForm1.Button5Click(Sender: TObject); 
var Data: TInfo; 
    i: integer; 
    s: string; 
begin 
for i:=0 to 255 do Data[i]:=0; 
Data:=GetInfo($04,12); 
if (Data[1]=0) then 
    begin StatusBar1.SimpleText:='No Data'; exit; end; 
s:=''; 
for i:=1 to 8 do 
    s:=s+Chr(Data[i+1]); 
Edit3.Text:=s; 
end;