Wie verwenden von Delphi-Dll(mit PChar-Typ) in C#
Hier ist der Delphi-DLL-code:
library Project2;
uses
SysUtils,
Classes;
{$R *.res}
function SimpleConv(const s: string): string;
var
i: Integer;
begin
Result := '';
for i := 1 to Length(s) do
if Ord(S[i]) < 91 then
Result := Result + S[i];
end;
function MsgEncode(pIn: pchar; InLen: Integer; var pOut: pchar; var OutLen: Integer): Boolean; stdcall;
var
sIn: string;
sOut: string;
begin
SetLength(sIn, InLen);
Move(pIn^, sIn[1], InLen);
sOut := SimpleConv(sIn); //Do something
OutLen := Length(sOut);
GetMem(pOut, OutLen);
Move(sOut[1], pOut^, OutLen);
Result := OutLen > 0;
end;
procedure BlockFree(Buf: pchar); stdcall;
begin
if assigned(Buf) then
FreeMem(Buf);
end;
exports
MsgEncode,
BlockFree;
begin
end.
Die Dll-Funktion MsgEncode wird allocmem zu schmollen, param, und die BlockFree wird verwendet, um den Speicher frei, die alloced von MsgEncode.
Meine Frage ist: Wie kann ich diese dll in C#? Ich bin ein Neuling in C#.
Welche VERSION von Delphi? (Sehr wichtig)
InformationsquelleAutor Leo | 2011-02-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Werde ich Ihre Frage zum Nennwert, mit ein paar Voraussetzungen:
PChar
weilPChar
schwebt zwischenAnsiChar
undWideChar
je nach Delphi-version. Ich bin davon ausgegangen, dass Sie die Verwendung der Unicode-Delphi. Wenn nicht, dann müssten Sie ändern Sie den string-marshalling bei den P/Invoke-Seite.BlockFree
damit es ein untypisierter Zeiger. Es gibt keine Notwendigkeit für Sie zu sein, Typen wiePChar
es nur zum telefonierenFree
.Hier ist die modifizierte Delphi-code:
Hier der C# code auf der anderen Seite:
Dieser sollte Ihnen den Einstieg. Da Sie neu in C# Sie gehen zu müssen zu tun, einiges zu Lesen bis auf P/Invoke. Genießen Sie!
Sie können nicht tun, und dieser code funktioniert nicht! Es tut GetMem und FreeMem in Delphi, mit dem gleichen heap.
Was kann ich tun, wenn ich mit Delphi 6 zu tun, die gleiche Funktionalität. Habe versucht, die gleichen Schritt, aber der Wert von "msg" wird "桔獩椠整瑳". (bin mit Delphi 6 & Visual studio 2010, .net framework 4.0)
Kennen Sie den Unterschied zwischen
PAnsiChar
undPWideChar
? ZwischenAnsiString
undUnicodeString
. ZwischenPtrToStringAnsi
undPtrToStringUni
?Nein, bin nicht familer mit PAnsiChar , PWideChar , AnsiString, UnicodeString..usw, bin gelehnt. bitte explaing, was muss ich tun das gleiche mit delphi 6.
InformationsquelleAutor David Heffernan
Beachten Sie, dass die C# - Zeichenfolge-Daten in Unicode, so dass, wenn Sie gehen mit dieser Delphi-code die Verwendung von PChar gibt es eine versteckte Umwandlung von PChar auf PWideChar durchgeführt, in der PInvoke-Aufruf. (Konvertierung Bedeutung Zuweisung eines anderen Speicher-Puffer und kopieren aller Daten auf die neuen Puffer) Falls Sie beabsichtigen, für diese Delphi-code mit C# Sie kümmern sich um die Leistung, sollten Sie Ihre Delphi-code zu bedienen auf PWideChar-Daten statt.
Es ist ein weiterer Grund für die Verwendung PWideChar statt PChar: Delphi weist der OleString geben Sie mithilfe der Win32-SysAllocString-Zuweisung, als pro-COM-Anforderungen. Dies bedeutet, dass der Empfänger der Zeichenfolge ist in der Lage freigeben es mit der Win32-API.
Wenn Sie eigentlich nicht auf die Textverarbeitung, die in Ihrer Funktion aber sind die Verwendung von PChar als ein Surrogat für ein array von beliebigen byte-Werte, die Sie bekommen kann Weg mit, dass auf der nicht verwalteten Seite von den Anruf, aber nicht auf der verwalteten Seite. Wenn es byte-Daten, es sollte deklariert als array of byte zu vermeiden, charset oder char Größe conversions.
Auf der C# Seite des Hauses, die Sie verwenden müssen, PInvoke aufrufen, der nicht verwalteten Delphi-DLL-Funktion. Sehen pinvoke.net für details über, wie kommentieren Sie den Aufruf in C# zu bekommen PInvoke kümmern sich um die Puffer-Zuweisung automatisch. Finden Sie eine Win32-API-Funktion, die vergeht, PChar (oder PWideChar) params ähnlich wie Ihre Funktion, und suchen Sie dann PInvoke.net für die PInvoke-Erklärung zu verwenden, die in verwaltetem code.
Dann noch mit PWideChar zugeteilt durch die SysAllocString ist wichtig.
Hast du gelesen mein P/Invoke Antwort, die vermeidet, dass SysAllocString?
große Delphi: nach meiner Zeit.
Was haben Sie gegen SysAllocString? Der code wäre viel einfacher, und Sie nicht haben, zu exportieren deallocator.
InformationsquelleAutor dthorpe
Bearbeitet
Sorry, ich hab nicht gesehen, dass du exportieren BlockFree Funktion auch.
Gilt die Faustregel: immer reservieren und gratis-Speicher in der gleichen Modul, wenn Sie Speicher in der Dll, sollte es freigegeben werden, die in derselben Dll auch.
Also, wenn Sie freien Speicher mit BlockFree, die Sie zuordnen, und der freie Speicher auf dem gleichen Modul, das ist OK.
Beachten Sie, dass Delphi-string und PChar-Typen sind versionsabhängig - Sie sind ANSI-vor Delphi 2009 und UNICODE in Delphi 2009 und nach.
InformationsquelleAutor kludg