Avatar billede brian0905 Nybegynder
14. juli 2008 - 13:13 Der er 5 kommentarer og
2 løsninger

Loade DLL og fra DLL kende den process der har loadet

Hejsa,
Jeg har en applikation hvor jeg loader en .dll. I mit library har jeg følgende:

procedure DLLEntryProc(EntryCode: integer);
var
  test: string;
begin
  test := ????
end;

hvordan finder jeg ud af hvad processen der har loaded "mig" hedder.? Jeg har kigget lidt på nogle C++ eksempler, der ser den lidt anderledes ud:

BOOL APIENTRY DllMain( HANDLE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved  )

Her skulle det handle jeg får med, være den kaldende applikation. Hvordan kan jeg få fat i navnet???
Avatar billede hrc Mester
15. juli 2008 - 01:43 #1
Jeg er ikke helt sikker på det er hvad du har brug for, men jeg bruger denne stump kode til at validere om det er mit program der kalder dll'et

i DLL'ets DPR-fil:

...

procedure DllMain(aReason: integer);
var
  buf: array[0..MAX_PATH] of char;
begin
  case aReason of
    DLL_PROCESS_ATTACH : begin // Executable attaches to DLL
                          GetModuleFileName(0, buf, SizeOf(buf));
                          if AnsiSameStr(ExtractFileName(string(buf)),'MyApp.exe') then
                            ExitCode := -1;
                        end;
    DLL_THREAD_ATTACH  : begin // Thread in exe calls DLL
                        end;
    DLL_THREAD_DETACH  : begin // Thread leaves DLL
                        end;
    DLL_PROCESS_DETACH : begin // Exe detaches from DLL
                        end;
  end;
end;

begin
  if not assigned(DllProc) then
  begin
    DllProc := @DllMain;
    DllProc(DLL_PROCESS_ATTACH);
  end;
end.

Alternativt kan du vel forlange at få programmets handle med i kaldet til dine procedurer og validere der. Det har jeg vist også et eksempel på, men jeg skal i seng da ungerne vækker mig kl. 6 (øv, jeg skal forestille at have ferie)
Avatar billede arne_v Ekspert
15. juli 2008 - 02:07 #2
Følgende udskriver navn på EXE fil (og kunne selvfølgelig sagtens lave noget andet):

library SomeDLL;

uses
  Dialogs,
  Forms;

{$R *.res}

function test: pchar; export;

begin
  test := 'It works';
end;

exports
  test;

begin
  ShowMessage('I was loaded by ' + Application.ExeName);
end.
Avatar billede brian0905 Nybegynder
15. juli 2008 - 08:21 #3
Takker for begge svar. Kan i ikke lige give et svar
Avatar billede hrc Mester
15. juli 2008 - 10:26 #4
Jeg er lidt utryg ved man griber fat i programmets Application-objekt, sådan som Ares eksempel gør. I DLL-sammenhænge synes jeg løsningen er for nem. Det plejer aldrig at være ligetil når man skal rode med de (s....) DLL-filer.
Avatar billede arne_v Ekspert
15. juli 2008 - 15:07 #5
Min hoved pointe er at bruge library body for koden. Ingen brug for DllMain.

Man kunne bruge GetModuleFileName fremfor Application.ExeName, men jeg gaetter paa
at Application.ExeName kalder GetModuleFileName !

Og et svar fra mig.
Avatar billede pidgeot Nybegynder
15. juli 2008 - 15:14 #6
For en god ordens skyld - ja, det gør den (nedenstående sakset fra D2005's kildekode):

function TApplication.GetExeName: string;
begin
  Result := ParamStr(0);
end;

function ParamStr(Index: Integer): string;
{$IFDEF MSWINDOWS}
var
  P: PChar;
  Buffer: array[0..260] of Char;
begin
  Result := '';
  if Index = 0 then
    SetString(Result, Buffer, GetModuleFileName(0, Buffer, SizeOf(Buffer)))
(...)

*går igen*
Avatar billede hrc Mester
15. juli 2008 - 20:47 #7
OK. Så er der jo ingen ko på isen. Jeg gad ikke lige dykke ned i VCL'et men det gjorde pidgeot. Mit eksempel er ud af en større sammenhæng og jeg gad ikke isolere GetModuleFileName. Desuden har jeg tit brug for konstruktionen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester