我在Delphi中構建一個DLL,它需要類似於Windows API的工作原理。此DLL只有一個導出函數...重新創建C#Delphi結構``Record``作爲參數傳遞到DLL中
function DoSomething(var MyRecord: TMyRecord): Integer; stdcall;
...其中TMyRecord
=我的紀錄,我需要在C#中重新創建。如果我沒有弄錯,這正是標準Windows API的工作原理。該記錄還包含對另一個記錄類型的參考...
TMyOtherRecord = record
SomeDC: HDC;
SomeOtherInt: Integer;
end;
TMyRecord = record
SomeInteger: Integer;
SomeColor: TColor;
SomeText: PChar;
SomeTextSize: Integer;
MyOtherRecord: TMyOtherRecord;
end;
問題第1部分:
我想看看我是否能避免使用PChar類型,如果可能的話。我不期望有超過255個字符能夠通過。是否有另一種我可以使用的類型,它不需要我使用size of string
?
問題第2部分:
我需要仔細檢查,我正確聲明本C#結構類,因爲它需要完全匹配的記錄在Delphi宣佈...
public struct MyOtherRecord
{
public IntPtr SomeDC;
public int SomeOtherInt;
}
public struct MyRecord
{
public int SomeInteger;
public Color SomeColor;
public string SomeText;
public int SomeTextSize;
public MyOtherRecord OtherReord = new MyOtherRecord();
}
問題第3部分:
在這種情況下,在記錄(或結構體內的結構體)內部有記錄是否安全?很確定,但我需要確保。
1.使用'System.Drawing.Color'不起作用。您需要使用整數類型並創建轉換函數。 2.我看不出'PChar'有什麼問題。當然你也不需要通過這個長度 - 它是零終止的。如果你真的不喜歡'PChar',那麼使用char'的內聯'array [0..255]。 3.不要在你的struct聲明中使用'new MyOtherRecord'。這只是一種內聯值類型。我不回答,因爲有太多問題需要回答。我寧願一次做一個。 –
擴展我最後的評論,這裏有關於'System.Drawing.Color'的問題。在p/invoke結構中有很多關於字符串的說法。等等。我只是沒有精力在一個答案中涵蓋所有角度。我懷疑CharSet,CallingConvention,DllImport等會有後續的跟進。也許別人會接受這個接力棒。抱歉。根據Stack Overflow慣例,你應該一次提出一個問題,當回答一個問題時應該涵蓋所有提出的問題。 –
哦,繼續吧,我會去的,但我不想在提交我的答案後進行大量修改!任何後續行動都可能成爲下一個問題! ;-) –