![]() |
AW: dll einbinden / Pointer Probleme
Ich rate einmal ins Blaue:
Delphi-Quellcode:
return := COM_GetVersionReq(zeiger, @typevers);
|
AW: dll einbinden / Pointer Probleme
leider nicht. Immernoch "Zugriffsverletzung bei Adresse xyz. Schreiben von Adresse abc aufgetreten".
Hmm, Klingt fast danach, als wollte die Funktion was reinschreiben, wird aber durch irgend einen Grund daran gehindert, oder? |
AW: dll einbinden / Pointer Probleme
Wie sieht denn der Original-Aufruf aus?
|
AW: dll einbinden / Pointer Probleme
Der Originalaufruf sieht so aus:
Code:
Sieht in meinen Augen aber sehr ähnlich aus, wie mein "Delphi-Versuch". m_hCom ist das Handle, welches durch die COM_TcpOpen Funktion gefüllt wurde - äquivalent meinem Delphi Programm.
//---------------------------------------------------------------------------
// Example of an implementation of a COM_GetVersionReq call //--------------------------------------------------------------------------- void CHwComTestGuiDlg::OnBnClickedButtonGetversion() { COM_Version version; if (COM_RETURN_OK == PrintErrorInfos("COM_GetVersionReq",COM_GetVersionReq(m_hCom,&version))) { printf("COM_Version: %d.%d.%d.%d\r\n",version.Major,version.Minor,version.Patch,version.Build); } } |
AW: dll einbinden / Pointer Probleme
Nächster Versuch:
Delphi-Quellcode:
function COM_GetVersionReq(zeiger:Pointer; var version: TCOM_Version): NativeUInt ; cdecl; external 'HwCom.dll';
|
AW: dll einbinden / Pointer Probleme
Super, danke dir! Nun läuft die Funktion schon mal durch und liefert 0 zurück (also alles ok soweit). Jetzt kommt die Zugriffsverletzung erst, wenn ich über end; springe.
Wird jetzt wohl noch daran liegen, dass er versucht, die Werte in eine Variable mit falschem Datentyp zu schreiben. Ich werd mal ein bisschen durch probieren. |
AW: dll einbinden / Pointer Probleme
Hast du bei der anderen Funktion nicht "stdcall" als Aufrufkonvention angegeben?
Im Normalfall sind alle Funktionen einer DLL einheitlich. Es scheint mir zumindest fragwürdig warum es bei dieser Funktion dann plötzlich "cdecl" sein sollte. |
AW: dll einbinden / Pointer Probleme
Wird auch sehr wahrscheinlich STDCALL sein, da es beim beenden crashed, dort wo "end" an die Rücksprungadresse springt die durch doppeltes aufräumen (CDECL/STDCALL) nicht stimmt.
Hier mal ein Denkanstoß, wenn man rausfidnen will ob cdecl/stdcall, auch wenn man jetzt nicht direkt den Aufruf hat, kann man das am retn in der dll festmachen, wenn man weiß dass mind. 1 parameter vorhanden ist. ![]() |
AW: dll einbinden / Pointer Probleme
Die Aufrufkoncention war mir von vorn herein unbekannt, deshalb hatte ich zuerst damit rumprobiert (zuerst stadcall, dann cdecl - jedoch bei allen Funktionen gleich). Mit CDECL hatte der Verbindungsaufbau zum Steuergerät zunächst funktioniert, deshalb hatte ich es dabei belassen.
Ich habe es nun wieder alles auf stdcall umgestellt und was soll ich sagen...es funktioniert! Kurzum: Ihr seid der Wahnsinn! Danke für eure Geduld! Als Delphi Newbie ist der Einstieg leider etwas holprig. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz