Форум: "Основная";
Текущий архив: 2002.04.04;
Скачать: [xml.tar.bz2];
ВнизКак узнать какая программа загрузила мою 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.004 c