Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.04.04;
Скачать: CL | DM;

Вниз

Как узнать какая программа загрузила мою DLL?   Найти похожие ветки 

 
Alx2 ©   (2002-03-21 08:27) [29]

>Rooman (20.03.02 19:15)
>Но опять же, приведите мне фрагменты исходников
>и докажите/опровергните

Типа, экзамен? :) Если нет возможности самостоятельно посмотреть модуль forms, лови:


constructor TApplication.Create(AOwner: TComponent);
var
P: PChar;
ModuleName: array[0..255] of Char;
begin
inherited Create(AOwner);
FBiDiMode := bdLeftToRight;
FTopMostList := TList.Create;
FWindowHooks := TList.Create;
FHintControl := nil;
FHintWindow := nil;
FHintColor := DefHintColor;
FHintPause := DefHintPause;
FHintShortCuts := True;
FHintShortPause := DefHintShortPause;
FHintHidePause := DefHintHidePause;
FShowHint := False;
FActive := True;
FIcon := TIcon.Create;
FIcon.Handle := LoadIcon(MainInstance, "MAINICON");
FIcon.OnChange := IconChanged;
GetModuleFileName(MainInstance, ModuleName, SizeOf(ModuleName));
OemToAnsi(ModuleName, ModuleName);
P := AnsiStrRScan(ModuleName, "\");
if P <> nil then StrCopy(ModuleName, P + 1);
P := AnsiStrScan(ModuleName, ".");
if P <> nil then P^ := #0;
AnsiLower(ModuleName + 1);
FTitle := ModuleName;
if not IsLibrary then CreateHandle; - Специально на случай DLL
UpdateFormatSettings := True;
UpdateMetricSettings := True;
FShowMainForm := True;
FAllowTesting := True;
FTestLib := 0;
end;


-----------
Т.е. application.exename должен указывать на какой-то путь. Это ясно. Доверие - нулевое, т.к. чтобы поверить в то, что этот путь равен именно пути головного процесса, надо просмотреть исходный код как минимум конструктора Application.
--------------

Не совсем конструктор, вернее, совсем не конструктор (об этом уже было в предыдущих сообщениях)


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


Остальные твои цитаты ничего нового не дают. Как бы сказал Digitman, и ежу понятно :))

Еще о старте DLL в модуле system:

procedure _StartLib;
asm
{ -> EAX InitTable }
{ EDX Module }
{ ECX InitTLS }
{ [ESP+4] DllProc }
{ [EBP+8] HInst }
{ [EBP+12] Reason }

{ Push some desperately needed registers }

PUSH ECX
PUSH ESI
PUSH EDI

{ Save the current init context into the stackframe of our caller }

MOV ESI,offset InitContext
LEA EDI,[EBP- (type TExcFrame) - (type TInitContext)]
MOV ECX,(type TInitContext)/4
REP MOVSD

{ Setup the current InitContext }

POP InitContext.DLLSaveEDI
POP InitContext.DLLSaveESI
MOV InitContext.DLLSaveEBP,EBP
MOV InitContext.DLLSaveEBX,EBX
MOV InitContext.InitTable,EAX
MOV InitContext.Module,EDX
LEA ECX,[EBP- (type TExcFrame) - (type TInitContext)]
MOV InitContext.OuterContext,ECX
XOR ECX,ECX
CMP dword ptr [EBP+12],0
JNE @@notShutDown
MOV ECX,[EAX].PackageInfoTable.UnitCount
@@notShutDown:
MOV InitContext.InitCount,ECX

CALL SetExceptionHandler

MOV EAX,[EBP+12]
INC EAX
MOV InitContext.DLLInitState,AL
DEC EAX

{ Init any needed TLS }

POP ECX
MOV EDX,[ECX]
MOV InitContext.ExitProcessTLS,EDX
JE @@noTLSproc
CALL dword ptr [ECX+EAX*4]
@@noTLSproc:

{ Call any DllProc }

MOV EDX,[ESP+4]
TEST EDX,EDX
JE @@noDllProc
MOV EAX,[EBP+12]
CALL EDX
@@noDllProc:

{ Set IsLibrary if there was no exe yet }

CMP MainInstance,0
JNE @@haveExe
MOV IsLibrary,1
FNSTCW Default8087CW // save host exe"s FPU preferences

@@haveExe:

MOV EAX,[EBP+12]
DEC EAX
JNE _Halt0
CALL InitUnits //Вот тут и родится Application при использовании модуля Forms :)
RET 4
end;





> Digitman
>если экз-р TApplication создается автоматически
>и безусловно в InitControls() ?
А что, это не так?

>при каких нештатных условиях
>м.б. выполнено условие Application <> nil,

Digitman, по-моему это просто правило хорошего тона. А нештатная ситуация может быть и такой: программа могла заранее похоронить этот Application. Правда, не знаю с какой целью, но это уже другие проблемы :)




Страницы: 1 вся ветка

Текущий архив: 2002.04.04;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.013 c
14-9598
SV
2002-02-20 23:30
2002.04.04
Клюква ;)


3-9394
SashaG
2002-03-12 08:59
2002.04.04
Пытаюсь св-ву Filter TTable сделать так:


1-9486
skywalker
2002-03-22 15:56
2002.04.04
SetLength


1-9433
ppcat
2002-03-24 19:36
2002.04.04
Delphi и ZIP архивы


1-9457
andr
2002-03-25 14:14
2002.04.04
завершение работы WinExec