Programmieren - alles kontrollieren 4.941 Themen, 20.715 Beiträge

aus c++ auf einen record in einer Pascal dll zugreiffen

pyranha / 5 Antworten / Baumansicht Nickles

Hi
Ich habe eine in Pascal geschriebene DLL, in der sich ein record befindet. Auf diesen Record möchte ich aus meiner C++ Applikation zugreifen. Ist das überhaupt möglich? Bisher hab ich es nur fertiggebracht, in der dll einen Pointer auf eine Struktur von meiner C++ Applikation zu erstellen.


Ich währe auch schon über ein Buchtip zu diesem Thema dankbar, da ich nichts schlaues gefunden habe.


Danke und Gruss
pyranha

bei Antwort benachrichtigen
Andreas42 pyranha „aus c++ auf einen record in einer Pascal dll zugreiffen“
Optionen

Hi!

Ich bin mir nicht ganz sicher, was du da machst bzw. machen willst. 8ich sag' auch gleich, dass ich nur ein Delphi zum testen hab).

Hast du eine Record-Definition in der DLL? Die DLL hat dann eine Funktion, die einen Zeiger auf ein Datenelement vom Typ des Records zurückliefert?

Es sollte möglichs ein, dies in eine C++ Struktur zu überführen. IMHO musst du die Datenstruktur des Records bytegenau in einer Struktur nachbilden. Dann müsste die Funktion der DLL aufgerufen werden, die den Zeiger zurück gibt und dann ein Typecast durchgeführt werden.

Falls du "nur" auf die Datendefinition des Typs Record zugreifen möchtest, da würde ich sagen, dass geht nicht.

Falls du beide Sourcen bearbeiten kannst Delphi-DLL und C++-Programm, dann würde ich für den datenaustausch, die Elemente des Records über eigene Funktionen in der DLL ansprechen.

Bis denn
Andreas

Hier steht was ueber mein altes Hard- und Softwaregedoens.
bei Antwort benachrichtigen
pyranha Andreas42 „Hi! Ich bin mir nicht ganz sicher, was du da machst bzw. machen willst. 8ich sag...“
Optionen

Hey, danke für deine Hilfe.

Du hast mich richtig verstanden, der selbe Lösungsansatz hat mir auch einer im Experts Exchange Forum gegeben.

Aber eine Frage hätte ich trotzdem noch. Wie finde ich heraus, vieviel platz dieser Record nun effektiv belegt, bzw. wie dieser auf die darin enthaltenen variablen aufgeteilt wird? Da sich der Record ja in einer DLL befindet, kann ich keinen Debugger benützen.

Herzlichen Dank
pyranha

bei Antwort benachrichtigen
Andreas42 pyranha „Hey, danke für deine Hilfe. Du hast mich richtig verstanden, der selbe...“
Optionen

Hi!

Ich weiss nicht, ob man das überhaupt ohne Dokumentation feststellen kann. Eien Typendeklaration ist ja abstrakt und wird AFAIK nicht in das erzeugte Programm eingebunden (IMHO ist die Debuginfo hier max. eine Verweis auf eine Zeile im Quelltext, ich bin mir da aber nicht sicher).

Ohne die genaue Deklaration kann man da IMHO nichts machen.

Hast du die Deklaration, dann müsste man an Hand der einzelnen Elemente herausfinden können, welche Datentypen verwendet werden und wie gross die sind.

Evtl. wäew noch eine indirekte Möglichkeit denkbar: falls ein Debugger das kann, müsste man den freien Speicher überwachen können. Ich weiss allerdings nicht, ob das mit aktuellen CPUs und Betriebssystemen machbar ist.
falls der Debugger die Möglichkeit bietet auf ASM-Code ebene zu debuggen, müsste man damit auch in die DLL hineindebuggen können, allerdings dürfte das mit die schlechteste Lösung sein.

Für weitere Tipps müsstest du noch posten, mit welchem C++ Compiler die genau arbeitest (und mit welchem Debugger; die genaue Version wäre nötig). Evtl. liest ja jemand mit, der sich in diesen Untiefen auskennt. ;-)

Meine ERfahungen auf dieser Ebene der Programmierung stammen noch aus 64er Zeiten, da werde ich nicht besonders gut weiterhelfen können. ;-)

Bis denn
Andreas

Hier steht was ueber mein altes Hard- und Softwaregedoens.
bei Antwort benachrichtigen
pyranha Andreas42 „Hi! Ich weiss nicht, ob man das überhaupt ohne Dokumentation feststellen kann....“
Optionen

Abend!

Für die Pascal DLL verwende ich den doch mitlerweile schon ziehmlich in die Jahre gekommenen TMT Pascal (ist soviel ich weiss noch nicht Object Pascal) und für die Applikation den C++ Builder 6.

Trotzdem vielen Dank für deine Infos!

Gruss pyranha

bei Antwort benachrichtigen
pyranha Nachtrag zu: „Abend! Für die Pascal DLL verwende ich den doch mitlerweile schon ziehmlich in...“
Optionen

Vielleicht gibts ja noch jemand der mir helfen könnte. Ich hab jetzt folgende 2 Strukturen:

in Pascal:

type
Tteststrukt = record
iVar : Integer; { 4 Byte }
dVar : double; { 8 Byte }
bVar : bool; { 1 Byte }
sVar : Array[1..50] of char; { n * 1 Byte }
end;

In C++:

typedef struct Ttest{
int iVar; // 4 Byte
double dVar; // 8 Byte
bool bVar; // 1 Byte
char sVar [50]; // n * 1 Byte
}Tteststrukt;

So wie ich das sehe müsste es doch jetzt funktionieren? Tuts aber leider nicht. Die Struktur wird mit folgender Funktion aus der DLL "geholt":

Tteststrukt getStrukt()
{
getStruktDLL * pGetStrukt;
Tteststrukt result;
HINSTANCE h = LoadLibrary("Test1.dll");
if(h != 0)
pGetStrukt = (getStruktDLL*)GetProcAddress(h, "_getStrukt");
if(getStrukt != NULL)
result = pGetStrukt();
FreeLibrary(h);
return result;
}

bei Antwort benachrichtigen