Einzelnen Beitrag anzeigen

snook

Registriert seit: 25. Jun 2010
94 Beiträge
 
Delphi 2005 Professional
 
#10

AW: fehler in assarbad DLL tutorial

  Alt 15. Mai 2011, 21:00
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:
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.
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 TDllProc = procedure (Reason: integer) .

was meine delphi version ist, hmmm keine ahnung, benutze BDS 2006, also evtl Delphi 2006?

Geändert von snook (15. Mai 2011 um 21:23 Uhr)
  Mit Zitat antworten Zitat