>> Jeg har ett library prosjekt (dll) som "erstatter" en orginal dll, dvs
>> alle funksjoner denne dll hadde har jeg erstattet med mine egne.
>
> Hvordan ved du præcis hvad den originale dll gør?
Ja det gjør jeg, og den blir brukt kun av 1 program om gangen, og dll'en
blir lagt sammen med .exe filen (ikke i system32)..
Det er en enkel dll som skriver noen data, og jeg har full oversikt over
alle procedurer og funksjoner (har fått docs av den orginale utvikleren).
3 av 5 programmer funker helt fint med min dll nå, men jeg har fortsatt
problemer med 2 stk.
Den ene krasher nå dll blir loaded(startup), og den andre crasher på close.
".exe raised too many consecutive exceptions: 'access violation at
0x00000000 read of address 0x00000000'. Process Stopped"
Så selve formen, og hele programmet med min dll funker, helt til jeg lukker
selve .exe (untatt den som crasher på startup da).
Jeg har lest og søkt masse på nettet, men kan ikke helt se hva jeg gjør
feil!?
Jeg bruker ingen stringer, så sharemem er ikke nødvendig.
Kanskje mere mere info, så her er en forkortet version av mine units og
selve library:
*****************************************************************************
Selve prosjektet library:
*****************************************************************************
library hardsid;
uses
SysUtils,
Classes,
Windows,
uForm in 'uForm.pas' {Form1},
uSidRip in 'uSidRip.pas';
{$R *.res}
....... og alle procedurer og functions...bruker stdcall
....
{==================================================================}
{ DllMain procedure
{==================================================================}
procedure DllMain(reason: integer);
begin
case reason of
DLL_PROCESS_ATTACH:
begin
ShowForm;
MakeSID;
end;
DLL_THREAD_ATTACH:
begin
end;
DLL_PROCESS_DETACH:
begin
KillSID;
KillForm;
end;
DLL_THREAD_DETACH:
begin
end;
end;
end;
{==================================================================}
{ Exports functions.....
{==================================================================}
exports
GetHardSIDCount,
InitHardSID_Mapper,
GetDLLVersion,
.... + flere
....
{==================================================================}
{ DLL initialize.....
{==================================================================}
begin
DllProc := @DllMain;
DllProc(DLL_PROCESS_ATTACH);
end.
*****************************************************************************
uForm unit kommer her:
*****************************************************************************
unit uForm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
StdCtrls, ExtCtrls, Menus, Dialogs;
type
TForm1 = class(TForm)
SaveDialog: TSaveDialog;
btnSave: TButton;
.... + mere
....
end;
var
Form: TForm1;
procedure ShowForm;
procedure KillForm;
implementation
uses
uSidRip;
{$R *.dfm}
procedure ShowForm;
begin
Form:= TForm1.Create(nil);
Form.Show;
end;
procedure KillForm;
begin
if Assigned(Form) then begin
Form.SysTimer.Enabled:= false;
FreeAndNil(Form);
end;
end;
*****************************************************************************
uSidRip her:
*****************************************************************************
unit uSidRip;
interface
uses
Windows, Classes, SysUtils;
type
TSidFake = Class(TObject)
private
...
public
constructor Create;
destructor Destroy; override;
...
...
end;
var
SID: TSidFake;
procedure MakeSID;
procedure KillSID;
implementation
uses
uForm;
procedure MakeSID;
begin
SID:= TSidFake.Create;
end;
procedure KillSID;
begin
if Assigned(SID) then begin
FreeAndNil(SID);
end;
end;
destructor TSidFake.Destroy;
begin
...
...
inherieted;
end;
|