Autor Beitrag
g1o2k4
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 493



BeitragVerfasst: Sa 14.06.08 10:17 
hi

ich habe in delphi eine dll geschrieben. mit funktionen die hauptsächlich mit strings arbeiten. die funktionen werden per stdcall exportiert.
das problem ist, dass ich die funktion nicht mit c# nutzen kann. c# erkennt anscheinend keine delphi string oder so.
ich habe schon daran gedacht einen pointer auf den string zurückzuliefern, aber wenn die funktion beendet wird ist der string ja weg.

wie kann ich den string persistent speichern (im heap vielleicht) und dann einen pointer zurückliefern ?
oder habt ihr andere vorschläge wie ich eine dll einen string an eine andere sprache zurückliefern lasse ?
dummzeuch
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 593
Erhaltene Danke: 5


Delphi 5 ent, Delphi 6 bis Delphi XE8 pro
BeitragVerfasst: Sa 14.06.08 22:29 
user profile icong1o2k4 hat folgendes geschrieben:

ich habe in delphi eine dll geschrieben. mit funktionen die hauptsächlich mit strings arbeiten. die funktionen werden per stdcall exportiert.
das problem ist, dass ich die funktion nicht mit c# nutzen kann. c# erkennt anscheinend keine delphi string oder so.
ich habe schon daran gedacht einen pointer auf den string zurückzuliefern, aber wenn die funktion beendet wird ist der string ja weg.

wie kann ich den string persistent speichern (im heap vielleicht) und dann einen pointer zurückliefern ?
oder habt ihr andere vorschläge wie ich eine dll einen string an eine andere sprache zurückliefern lasse ?


Zwei Moeglichkeiten fallen mir da spontan ein:

1. Statt einer DLL einen COM-Server schreiben, den kann man dann auch von C# (und fast allen anderen Sprachen) aus verwenden.
2. Statt String einen OleString zurueckliefern, den sollte C# auch kennen und da der Speicher dafuer von Windows verwaltet wird, gibt es auch nicht die ueblichen Probleme bei der Stringuebergabe ueber DLL-Grenzen hinweg.

twm
g1o2k4 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 493



BeitragVerfasst: Mo 16.06.08 22:15 
danke für den tipp...aber mit 2. hats nicht geklappt und 1. war mir zu umständlich...

ich habs jetzt anders gelöst.
einer procedure einen pointer übergeben und in der procedure die adresse im ptr schrittweise erhöht und in jedem schritt an die aktuelle adresse des ptrs einen char des strings geschrieben...anschließend kann man in c# ganz normal die chars wieder auslesen und zu nem string schreiben.
dummzeuch
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 593
Erhaltene Danke: 5


Delphi 5 ent, Delphi 6 bis Delphi XE8 pro
BeitragVerfasst: Di 17.06.08 08:27 
user profile icong1o2k4 hat folgendes geschrieben:
danke für den tipp...aber mit 2. hats nicht geklappt und 1. war mir zu umständlich...

ich habs jetzt anders gelöst.
einer procedure einen pointer übergeben und in der procedure die adresse im ptr schrittweise erhöht und in jedem schritt an die aktuelle adresse des ptrs einen char des strings geschrieben...anschließend kann man in c# ganz normal die chars wieder auslesen und zu nem string schreiben.


Hm, 2. hat nicht geklappt? Was hat denn nicht geklappt? Ich benutze kein C#, aber eigentlich sollten OleStringszwischen allen Programmiersprachen funktionieren.

Was Deine Loesung angeht: Ich hoffe, Du hast daran gedacht, den Speicher fuer den String zu reservieren und gibt ihn hinterher wieder frei. Zum Kopieren kannst Du dann auch StrPCopy verwenden.

twm
g1o2k4 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 493



BeitragVerfasst: Di 17.06.08 13:22 
ich muss daran nicht denken :P
ich kann auch kein c#
ich hab nur die dll geschrieben, ein kollege benutzt sie mit c#. er allokiert den speicher gibt mit den pointer, ich schreib was rein und er arbeitet dann mit den pointern weiter...

und nichtmal er muss den speicher freigeben, wozu gibts denn in c# nen garbage collector :P

aber ich finds auch merkwürdig, dass ole strings nicht gehen...ich hätte gedacht, dass dlls ein höheres maß an kompatibilität bieten. was delphi betrifft hat immer alles geklappt aber jetzt wo ich mit anderen sprachen zusammenarbeite, bin ich schwer enttäuscht !
hazard999
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 162

Win XP SP2
VS 2010 Ultimate, CC.Net, Unity, Pex, Moles, DevExpress eXpress App
BeitragVerfasst: Di 17.06.08 13:46 
wie wärs mit einem widestring und cdecl oder stdcall als aufruf-konvention der funktion?

_________________
MOV EAX, Result;MOV BYTE PTR [EAX], $B9;MOV ECX, M.Data;MOV DWORD PTR [EAX+$1], ECX;MOV BYTE PTR [EAX+$5], $5A;MOV BYTE PTR [EAX+$6], $51;MOV BYTE PTR [EAX+$7], $52;MOV BYTE PTR [EAX+$8], $B9;MOV ECX, M.Code;MOV DWORD PTR [EAX+$9], ECX
g1o2k4 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 493



BeitragVerfasst: Di 17.06.08 16:46 
war beides der fall(widestring/stdcall)...ging nicht