Laden...

Delphi 7 dll importieren: Aufruf von Methode aus DLL lässt Anwendung ohne Exception festhängen

Erstellt von And.Wolf vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.509 Views
A
And.Wolf Themenstarter:in
65 Beiträge seit 2010
vor 13 Jahren
Delphi 7 dll importieren: Aufruf von Methode aus DLL lässt Anwendung ohne Exception festhängen

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

795 Beiträge seit 2006
vor 13 Jahren

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.

`There are 10 types of people in the world: Those, who think they understand the binary system Those who don't even have heard about it And those who understand "Every base is base 10"`
A
And.Wolf Themenstarter:in
65 Beiträge seit 2010
vor 13 Jahren

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

1.044 Beiträge seit 2008
vor 13 Jahren

Hallo And.Wolf,

du kannst nicht StringBuilder verwenden. StringBuilder ist eine Klasse, kein string. Mit StringBuilder kann man nur strings "bearbeiten".

zero_x

A
And.Wolf Themenstarter:in
65 Beiträge seit 2010
vor 13 Jahren

Was soll cih den für PAnsiChar verwenden?

795 Beiträge seit 2006
vor 13 Jahren

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.

`There are 10 types of people in the world: Those, who think they understand the binary system Those who don't even have heard about it And those who understand "Every base is base 10"`
A
And.Wolf Themenstarter:in
65 Beiträge seit 2010
vor 13 Jahren

Deklaration:

function encode(Par:PAnsiChar): PAnsiChar;

Er findet in der dll auch den einstiegspunkt.

Gruß
Andreas

N
46 Beiträge seit 2007
vor 13 Jahren

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

S
248 Beiträge seit 2008
vor 13 Jahren

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.

N
46 Beiträge seit 2007
vor 13 Jahren

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