我正在嘗試將加密函式從我們的遺留代碼中分離到一個我可以從 C# 呼叫的 dll,但是我在讓它作業時遇到了問題,并且在呼叫 dll 時我不斷遇到訪問沖突。
我不確定 AV 發生在哪里,因為當 dll 附加到另一個行程時,delphi 很難達到我的斷點。
我昨天在這里使用 David Heffernan 的回答讓它作業了:將字串從 delphi dll 回傳到 64 位的 C# 呼叫程式
但是我的成功是短暫的,因為我將字串引數更改為常規string的 (delphi) 發現它不起作用并將它們改回AnsiString(我們的加密例程需要 Ansi)。因為我改變了這些引數型別。我無法讓它再次作業。
這是我的德爾福代碼:
procedure Encrypt(const Source: AnsiString; const Key: AnsiString; var OutPut:PAnsiChar; const OutputLength: Integer);
var
EncryptedString, EncodedString: AnsiString;
begin
EncryptedString := Crypt(Source, Key);
EncodedString := Encode(EncryptedString);
if Length(EncodedString) <= OutputLength then
System.AnsiStrings.StrPCopy(Output, EncodedString);
end;
exports
Encrypt;
我的 C# 呼叫者:
[DllImport("AsmEncrypt.dll", CharSet = CharSet.Ansi)]
public static extern void Encrypt(string password, string key, StringBuilder output, int outputlength);
// using like this:
Encrypt(credentials.Password, myKey, str, str.Capacity);
我現在最好的選擇是,我已經混淆了 dll 的一些引數,因為它似乎在它到達OutputDebugStr()我放在第一行之前崩潰了Encrypt()
所有幫助將不勝感激
uj5u.com熱心網友回復:
從這個檔案頁面:
AnsiString 結構包含一個 32 位長度指示符、一個 32 位參考計數、一個 16 位資料長度指示每個字符的位元組數和一個 16 位代碼頁。
所以 anAnsiString不僅僅是一個指向字符陣列的指標——它是一個指向編碼一堆資訊的特殊結構的指標。
但是,.NET 的 P/Invoke 機制將傳遞一個指向字符陣列的指標。Delphi 將嘗試將其解釋為指向其特殊 AnsiString 結構的指標,但事情不會順利進行。
我認為您將很難AnsiString在互操作中使用。最好選擇 .NET 和 Delphi 都知道的字串型別。如果您隨后需要將其轉換為AnsiString,請在 Delphi 中執行此操作。
uj5u.com熱心網友回復:
將 Delphi 函式更改為
procedure Encrypt(Source, Key, OutPut: PAnsiChar; OutputLength: Integer); stdcall;
為了使此代碼作業。
您可能還應該將長度引數設為 IN/OUT,以便呼叫者可以在呼叫回傳后調整字串構建器物件的大小。這也將允許被呼叫者向呼叫者發出任何錯誤信號,這是您當前設計中的另一個缺陷。
我還必須說,AnsiString用作位元組陣列是失敗的秘訣。是時候開始正確地進行加密了。如果您有文本,則將其編碼為具有特定編碼的位元組陣列,通常這意味著 UTF-8。然后將該位元組陣列加密為另一個位元組陣列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/315585.html
