![]() |
fehler in assarbad DLL tutorial
ich bin mir nun nicht sicher, ob es schon bemerkt wurde (also nicht böse sein wenn es zu spät kommt). in assarbad tutorial zu DLL's steht im Abschnitt DllMain() Funktion die deklaration der main-proc variable mit
Delphi-Quellcode:
aufrufkonvention. das hat mir jetzt in meinem projekt ordentlich schwierigkeiten bereitet. zumindest in meiner delphi versioni muss dass OHNE jede aufrufkonvention deklariert werden.
stdcall
das hatte bei meinem projekt zur folge, das spontan bei aufrufen der Dll's eine AV ausgelöst wurde und das programm komplett abgeraucht ist, obwohl ich die Dll normal laden konnte. auch gab es keine warnung über eine falsche aufrufkonvention oder ähnliches und die AV's konnte ich auch nicht ohne weiteres darauf zurückführen, zumal sie unwillkürlich aufgetreten sind. ich hoffe ich konnte jemandem behilflich sein |
AW: fehler in assarbad DLL tutorial
Was machst du denn in DllMain alles?
Laut Doku von DllMain ist die Aufrufkonvention WINAPI, welche in stdcall aufgelöst wird. Siehe ![]() Also musst du darin irgendetwas verbotenes machen, damit es manchmal AVs hagelt. |
AW: fehler in assarbad DLL tutorial
PS: Es kann keine Meldung kommen, wenn man eine falsche Aufrufkonvention nutzt, denn sowas wird nirgendwo geprüft.
Es nallt nur, wenn die übergebenen Parameter falsch übergeben werden, bzw. nicht richtig aufgeräumt werden und das Programm dann z.B. versucht an einer falschen Stelle auf was zuzugreifen, welches woanders liegt. Und Nein, StdCall ist schon richtig ... also kann ich Dezipaitor nur zustimmen, daß der Fehler ganz bestimmt nicht an dieser Stelle zu finden ist. |
AW: fehler in assarbad DLL tutorial
hmmmmmm das ist wirklich sehr merkwürdig. wie schon gesagt, ich hab es rausgenommen und wild rumprobiert, ich kann keine exception mehr provozieren. übrigens bin ich durch einen delphipraxis post drauf gestoßen
![]() edit\\ vielleicht haben wir ja auch aneinander vorbeigeredet. ich meinte die variable in assarbads tutorial, die heisst DLLMain und sollte vom typ TDllProc sein, und der ist in der system unit ohne stdcall deklariert |
AW: fehler in assarbad DLL tutorial
Delphi-Quellcode:
type
TDLLProc = procedure (Reason: Integer); // TDLLProcEx provides the reserved param returned by WinNT TDLLProcEx = procedure (Reason: Integer; Reserved: Integer); |
AW: fehler in assarbad DLL tutorial
Zitat:
![]() Zudem heißt der Name nicht DllProc, sondern DllMain! Kein Wunder, dass du AVs bekommst, wenn schon die Deklaration anders ist :) Bitte lies dir den MSDN Artikel genau durch: ![]() |
AW: fehler in assarbad DLL tutorial
In Delphi gibts doch gar kein DllMain. Dort gibt es dochnur DllProc und die wird vom Threadersteller erwähnt wohl ohne stdcall deklariert.
|
AW: fehler in assarbad DLL tutorial
Funktionierte damals tadellos, keine Ahnung ob es daran lag, daß ich eine uralte Version von Delphi benutzt habe. Schon zum Zeitpunkt der Veröffentlichung des Tutorials war das Ding 5 Jahre alt oder so. Meine Frage wäre also erstmal, welche Delphiversion du benutzt. Es ist gut möglich, daß das mit Kylox oder so geändert wurde.
Kann dir gern die SXWs zukommen lassen, falls du eine korrigierte Version veröffentlichen willst. Und auch wenn für DLLProc und DllMain die Aufrufkonventionen verschieden wären, so entsprechen sich diese Funktionen doch direkt in ihrer Funktionalität. Ist halt die Methode wie Delphi es erledigt. |
AW: fehler in assarbad DLL tutorial
Habe soviel in C zur Zeit geschrieben, dass ich das Delphizeugs garnicht mehr kenne :)
Aber schau dir das mal an: ![]() |
AW: fehler in assarbad DLL tutorial
ooohh jetzt bin ich selber (noch mehr) verwirrt. also worauf ich hinaus wollte war die aufrufkonvention der methode "DLLMain" in assarbadas tutorial. hatte das übernommen (war übrigens eine große hilfe dein tutorial). leider kam es dann immer wieder zu programmabstürzen die sich nirgends abfangen ließen (im anhang mal nen bericht von madexcept). aus zufall bin ich dann auf den oben genannten thread gestoßen, hatte die deklaration der DllProc vairablen ersetzt und alles lief auf einmal hervorragend. kann natürlich gut sein, dass es bei andren delphi versionen verschiedene aufrufkonventionen für diese methode gibt.
Delphi-Quellcode:
ich bin erst seit zwei jahren bei delphi, aber soweit ich das verstanden habe, wird doch DLLProc von Delphi selbst aufgerufen, also sollte man sich doch bei ner änderung des methodenzeigers an die aufrufkonvention der ursprünglichen DllProc halten, und diese ist
library ExtPlugIns;
{ Wichtiger Hinweis zur DLL-Speicherverwaltung: ShareMem muss sich in der ersten Unit der unit-Klausel der Bibliothek und des Projekts befinden (Projekt- Quelltext anzeigen), falls die DLL Prozeduren oder Funktionen exportiert, die Strings als Parameter oder Funktionsergebnisse übergeben. Das gilt für alle Strings, die von oder an die DLL übergeben werden -- sogar für diejenigen, die sich in Records und Klassen befinden. Sharemem ist die Schnittstellen-Unit zur Verwaltungs-DLL für gemeinsame Speicherzugriffe, BORLNDMM.DLL. Um die Verwendung von BORLNDMM.DLL zu vermeiden, können Sie String- Informationen als PChar- oder ShortString-Parameter übergeben. } uses FastMM4, madExcept, madLinkDisAsm, madListHardware, madListProcesses, madListModules, Windows, SysUtils, Classes, LibMethods, ExtPlugIn; var DLLProcNext : procedure(Reason: Integer) = nil; //<-- hier und unten in der deklaration von DllMain ein stdcall, und es kracht procedure RegisterPlugIns; begin RegisterPlugIn(1.0,PChar('8.5.2011'),PChar('SP'),PChar('ResourceManager'), TResourceManagerPlugIn); end; function ExportAdapter(out Adapter): boolean; stdcall; begin result := GetAdapter(Adapter); end; procedure DLLMain(Reason: Integer); begin case Reason of DLL_PROCESS_ATTACH: begin CreateAdapter; RegisterPlugIns; end; DLL_THREAD_ATTACH:; DLL_THREAD_DETACH:; DLL_PROCESS_DETACH: FreeAdapter; end; if Assigned(DLLProcNext) then DLLProcNext(Reason); end; exports ExportAdapter name 'GetAdapter'; {$R *.res} begin DLLProcNext := Pointer(InterlockedExchange(Integer(@DLLProc), Integer(@DLLMain))); DLLMain(DLL_PROCESS_ATTACH); end.
Delphi-Quellcode:
.
TDllProc = procedure (Reason: integer)
was meine delphi version ist, hmmm keine ahnung, benutze BDS 2006, also evtl Delphi 2006? |
AW: fehler in assarbad DLL tutorial
Liste der Anhänge anzeigen (Anzahl: 1)
sry, hier der bugreport, war zu schnell ^^
edit\\ der fehler lässt sich übrigens gezielt reproduzieren, wenn man in ner dll ne ableitung von TCOmmondialog erzeugt. dann werden einige dlls neu geladen und irgendwie betritt er dann auch die gerade aktive. dabei krachts dann früher oder später |
AW: fehler in assarbad DLL tutorial
Zitat:
Ich weiß nur, daß es mit Delphi 4 getestet war und funktionierte. Leider habe ich kein Delphi 4 mehr, sondern die älteste Version die ich derzeit habe ist Delphi 7. Ob es wirklich ein Fehler ist kann nur jemand mit Delphi 4 bestätigen. Aber wie Dezipaitor bereits erwähnte, da es sich bei DLLProc um eine interne Geschichte handelt, ist es gut möglich, daß sich das über die Jahre geändert hat. |
AW: fehler in assarbad DLL tutorial
ich hab mich auch schon über die überschrift geärgert, als ich sie dann gelesen hatte. wollte eigentlich nur anderen, die evtl das gleiche problem haben die suche nach dem problem ersparen, weil es echt nicht leciht zu finden war (für mich zumindest)
vielleicht kann ja ein admin die überschrift ändern (in "checkt eure version" oder so ;) ) war nur schon recht spät und ich hab mich zwei wochen mit dem fehler rumgeschlagen. Dennoch hat mir dien tutorial SEEEEHR gehjolfen und ist vielleicht auch mal ein danke angebracht: DANKE |
AW: fehler in assarbad DLL tutorial
Zitat:
|
AW: fehler in assarbad DLL tutorial
2 Wochen?? OMG!
Hättest du Assarbad vor 2 Wochen direkt gefragt, dann hättest du sicher schon eine Antwort/Lösung vor einer Woche gehabt :lol: |
AW: fehler in assarbad DLL tutorial
haha vor zwei wochen wusste ich nur, dass ich ein problem habe, genauer konnte ich es noch nicht spezifizieren. die größte hilfe war dann madExcept. vorher dachte ich, es liegt an nicht, oder falsch verarbeiteten windows messages
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:06 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