Hallo,
ich würde gerne eine Funktion aus einer dll exportieren die in Delphi (7) geschrieben wurde.
Die dll liegt im selben verzeichniss wie das Programm.
Ich mache das bisher so:
[DllImport("mydll.dll", SetLastError = true,CharSet = CharSet.Ansi)]
private static extern StringBuilder MyFunction(StringBuilder Par);
In Delphi sind Strings als Übergabeparameter angegeben.
Wenn ich die DLL in Delphi einbinde und PAnsiChar verwende läuft auch alles einwandfrei.
In C# fliegt mir aber meine Application auseinander wenn ich die Funtkion nutze.
ein try catch kann dies auch nciht abfangen.
Was mache ich falsch?
Hat da jemand ein gutes tutorial oder andere Tipps?
Danke & Gruß
Andreas
In C# fliegt mir aber meine Application auseinander wenn ich die Funtkion nutze.
Was hast du für eine Exception?
Wie ist die Delphi-Funktion deklariert?
Gruß, Christian.
Ah sorry.
Ja das wollte ich gerade erweitern.
Also in Delphi nimmt er einen PAnsiChar entgegen und gibt einen wieder zurück.
Wie bereits gesagt kann mein try catch das nicht abfangen.
Damit habe ich auch keine Exception.
Es kommt nurnoch von Windows das das Programm nicht mehr reagiert und das wars.
Gruß
Andreas
Hallo And.Wolf,
du kannst nicht StringBuilder verwenden. StringBuilder ist eine Klasse, kein string. Mit StringBuilder kann man nur strings "bearbeiten".
zero_x
zero_x | <span style="font-size: 10;">my</span><span style="font-size: 10;">CSharp</span><span style="font-size: 10;">.de</span> - gemeinsam mehr erreichen
Für längere Zeit inaktiv.
Doch, StringBuilder geht schon.
Ich hab auch viele selbstgeschriebene Delphi-Dll's und da funktionierts nur mit StringBuilder.
Kann es sein, dass dein Delphi-Funktion die .Net-Anwendung blockiert?
Und zeig mal bitte die Deklaration der Delphi-Funktion.
Gruß, Christian.
Deklaration:
function encode(Par:PAnsiChar): PAnsiChar;
Er findet in der dll auch den einstiegspunkt.
Gruß
Andreas
Hallo And.Wolf,
[DllImport("mydll.dll", SetLastError = true,CharSet = CharSet.Ansi)]
private static extern StringBuilder MyFunction(string Par);
versuch es mal so. Hab's jetzt nicht ausprobiert. Ich weiss auf jeden Fall, dass Du einmal den Stringbuilder für den Rückgabewert nutzen musst, einen einfachen String für den Übergabeparameter. Klingt erstmal komisch, ist aber so 😉
Evtl. musst Du noch die Calling Convention im Delphi Code auf StdCall anpassen.
Grüsse,
N1ls
Ich weiss auf jeden Fall, dass Du einmal den Stringbuilder für den Rückgabewert nutzen musst, einen einfachen String für den Übergabeparameter.
Das ist Unsinn. StringBuilder dient bei Plattformaufrufen als beschreibbarer Puffer. Diesen Methoden übergibt man den StringBuilder + dessen Kapazität.
Wenn du eine konstante Zeichenkette als Parameter übergibst oder als Rückgabewert bekommst kann dieser als string deklariert werden.
Beispiel:
int WINAPI GetWindowText(__in HWND hWnd, __out LPTSTR lpString, __in int MaxCount);
wird zu:
int GetWindowText(IntPtr hWnd, StringBuilder lpString, int MaxCount);
wohingegen
BOOL WINAPI SetWindowText(__in HWND hWnd, __in_opt LPCTSTR lpString);
zu
bool SetWindowText(IntPtr hWnd, string lpString);
wird.
Es kommt auf die Verwendung des Parameters an, welche man der Dokumentation entnehmen muss.
Der Artikel Marshalling zwischen verwaltetem und nicht verwaltetem Code geht auf das ganze Thema etwas detaillierter ein.
Das ist Unsinn. StringBuilder dient bei Plattformaufrufen als beschreibbarer Puffer. [...]
Wenn du eine konstante Zeichenkette als Parameter übergibst oder als Rückgabewert bekommst kann dieser als string deklariert werden.
Wenn das so unsinnig ist, wäre es ja schön gewesen, Du hättest auch mal ein entsprechendes Beispiel mit einem String-Rückgabewert aufgeführt.
MfG,
N1ls