隨着編譯的Delphi DLL,申報的功能之一是德爾福DLL函數的C#
MYDLL.DLL
type
TInfo = array [0..255] of byte;
type
public
function GetInfo(Memadr, Infolen: Integer): TInfo;
是什麼在C#中使用這個格式的DllImport?
隨着編譯的Delphi DLL,申報的功能之一是德爾福DLL函數的C#
MYDLL.DLL
type
TInfo = array [0..255] of byte;
type
public
function GetInfo(Memadr, Infolen: Integer): TInfo;
是什麼在C#中使用這個格式的DllImport?
我會做這樣的:
德爾福
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需要使用一些指針算術或其他等價物。
+ 1然而...... OP可能實際上試圖導出「對象的過程」並將其稱爲過程。 (爲什麼他會把公共關鍵字放在他的方法簽名之上?)。 –
@Warren由於無法導出Delphi對象,因此無法導出「對象過程」。要導出一個OOP接口,您需要查看COM或不透明的句柄以查看對象引用。 –
當然你不能,而且我知道,但我不知道OP的「示例代碼」中的「公共」是在試圖告訴我們......在頂級單位範圍內,public並不是有效的關鍵字。這表示OP混淆。 –
需要在我原來的職位,以糾正錯誤,
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;
好像你從更高的層次聲明,可能是一個類聲明中提取的函數聲明瞭。我懷疑這是因爲掛着「類型」和「公共」字樣。瞭解適當的導入定義非常重要。 –
檢查此鏈接: [調用從C#代碼一個Delphi DLL方法](http://stackoverflow.com/questions/2200521/calling-a-delphi-dll-method-from-c-code) –