Bei einer Funktion wie:
public static extern void SendMessage(string Command);
Wo die DLL ein PChar erwartet als Command. Und das habe ich jetzt auch schon ausprobiert und funktioniert ebenso wie die Variante von davor. Einfach nur als Übergabe, nicht als Referenzübergabe.
Na, jedenfalls danke nochmal. Meine DLL scheint jetzt zu laufen, und gelernt habe ich auch noch was.
Gruß, BeGreen
Dann habe ich noch eine kurze Frage, die du wahrscheinlich auch ganz schnell beantworten kannst. Funktioniert die ganze auch so wenn eine Funktion ein PChar als Übergabeparameter erwartet?
Gruß, BeGreen
Ich krieg glatt Tränen in die Augen. Ich sitze da jetzt seit vier Tagen an dem Problem. Danke für die Hilfe. Als kleine Anmerkung dazu: Deine erste Variante ohne den Marshal hat funktioniert, nicht die zweite. Für die Nachwelt.
Was mich jetzt natürlich noch wundert ist, wieso hat es mit einem Delphi Programm bislang immer funktioniert? Aber das ist mir jetzt auch fast egal. Danke nochmal.
Gruß, BeGreen
[Edit] Ich werde die Delphi DLL mit einer globalen Variable versehen, um das Problem generell zu vermeiden. Ist auch keine große Sache.
Danke erstmal,
aber das Ergebnis ist das gleiche.
Vielleicht liegt es ja an der DLL? Sie funktioniert in Zusammenarbeit mit Delphi Programmen. Aber nicht mit meinem C# Testprogramm. Vielleicht weil in der DLL kein Speicher allociert wird?
Hier mal der Code der Delphi DLL-Funktion:
function GetMessage: PChar; stdcall; export;
begin
if Module.IncomingList.Count > 0 then
begin
Result := PChar(Module.IncomingList[Module.IncomingList.Count - 1]);
Module.IncomingList.Delete(Module.IncomingList.Count - 1);
end
else Result := '';
end;
Mit Module.IncomingList ist eine Delphi TStringList gemeint. Grob gesagt nimmt diese Funktion einen String aus dieser Liste, castet diesen nach PChar und gibt ihn als Result zurück. Könnte hier ein Problem enstehen?
Denn sonst kann ich es mir nicht mehr erklären. Ich hoffe du hast noch eine Idee? Ach ja, und das mit den absoluten Pfaden beim DllImport kommt natürlich weg sobald ich es zum Laufen bekommen habe.
Gruß, BeGreen
Hallo und danke erstmal für die Antwort.
Aber .... es funktioniert nicht 🙂
Hier ist der DLLImport:
[DllImport(@"c:\\mydll.dll", CharSet = CharSet.Ansi)]
public static extern string GetMessage();
und hier der Aufruf:
private void Button1_Click(object sender, System.EventArgs e) {
string Msg;
Msg = GetMessage();
}
und das ist die Fehlermeldung:
System.NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
at MyProject.Form1.GetMessage()
Bestimmt habe ich irgendwas dummes übersehen. Aber was?
Gruß, BeGreen
Hallo alle zusammen,
ich habe zwar geschaut ob es eine vergleichbare Frage gibt, habe aber nichts gefunden. Also nicht schlagen falls ich was übersehen habe.
Ich habe eine DLL die in Delphi geschrieben wurde, und diese möchte ich in mein C# Programm einbinden. Die meisten Funktionen stellen kein Problem dar, ausser dieser einen:
DELPHI:
function GetMessage: PChar; stdcall; export;
Diese Delphi DLL-Funktion gibt einen PChar zurück. Ich glaube das entspricht dem char* von C# aber mit absoluter Sicherheit weiss ich es nicht.
Jedenfalls schaffe ich es nicht erfolgreich diese Funktion aufzurufen. Ich habe verschiedene DLLImport Aufrufe probiert und bin jetzt völlig verwirrt. Das ich am Ende gerne den String hinter diesen PChar hätte ist noch einmal eine andere Sache, da ich schon bei einem erfolgreichen Aufruf scheitere. Ich hoffe Ihr könnt mir helfen oder einen Tip geben. Bin mit meinem Latein am Ende.
PS: Ich habe zwar Zugriff auf die Delphi-DLL, kann Sie aber nicht ändern, weil andere Systeme schon erfolgreich mit dieser DLL arbeiten.
Gruß, BeGreen