Форум: "WinAPI";
Текущий архив: 2004.07.11;
Скачать: [xml.tar.bz2];
ВнизСкрытие процесса Найти похожие ветки
← →
Term © (2004-06-02 15:25) [0]проблема такая хочу сделать так если моя прога запускается в 9x то её не видно в списке задач, а если NT то чтобы енто всё чтобы не срабатывало, сделал так:
OSVersion.dwOSVersionInfoSize:=SizeOf(OSVersion);
if GetVersionEx(OSVersion) then
if OSVersion.dwPlatformId=VER_PLATFORM_WIN32_WINDOWS then
begin
RegisterServiceProcess(GetCurrentProcessID, 1);
end;
т.е определяю версию и если 9x то прячу если нет то оставляю как есть, но тут такие грабли в NT всё равно ругается так как будто никаких проверок на версию винды не делаю что за грабли и как их победить????
← →
Yanis (2004-06-02 15:32) [1]Надо статически функцию вызывать. В NT нет такой функции с целью увеличения безопасности.
← →
Term © (2004-06-02 15:36) [2]
if OSVersion.dwPlatformId=VER_PLATFORM_WIN32_WINDOWS then
но ведь этим условием я определяю версию винды если NT то чтобы проскакивал а он матюганится всё равно, как будто условия проверки нету.......
← →
Yanis © (2004-06-02 15:45) [3]В твоём случае, у тебе в коде программы должна быть строка где ты описываешь злополучныю функцию и тем самым говоришь Windows что при загрузке нужна такая то функция, а её нет вот и облом!
← →
Bar (2004-06-02 15:50) [4]По-моему ошибка можеит быть примерно такая.
Ежели ты вызываешь RegisterServiceProcess из статическо библиотеки, то в любом случае с проверкой или без будут попытка найти функцию RegisterServiceProcess в соответствующей dll-ке. Так как "В NT нет такой функции с целью увеличения безопасности.
" то и глючит. Надо при условии
if OSVersion.dwPlatformId=VER_PLATFORM_WIN32_WINDOWS
динамически подключить библиотеку с функцией RegisterServiceProcess , получить адрес этой ф-ции и вызвать её. Как это далается? Посмотри инфу по динамической загрузке dll. Что то вроде такого:
type
TAddFunction=function(K:integer):integer; stdcall;
procedure TForm1.Button2Click(Sender: TObject);
var
Add1:TAddFunction;
HLib:THandle;
N:integer;
begin
HLib:=0;
try
HLib:=LoadLibrary("FirstLib.dll");
if HLib>HINSTANCE_ERROR then begin
Add1:=GetProcAddress(HLib,"CalculateSum");
if Assigned(Add1) then begin
N:=StrToInt(Edit1.Text);
N:=Add1(N);
Edit1.Text:=IntToStr(N);
end else ShowMessage("Method with name CalculateSum was not found");
end else ShowMessage("Can not load library FirstLib.dll");
finally
if HLib>HINSTANCE_ERROR then FreeLibrary(HLib);
end;
end;
Извини, лень было передылывать под твою задачу. Сам замени имена ф-ции и dll-ки.
Удачи.
← →
Term © (2004-06-02 15:51) [5]
function RegisterServiceProcess(dwProcessID, dwType: Integer): Integer; stdcall;
external "KERNEL32.DLL";
типа того ??? это есть, в 9х всё норма ведь :))
а вот в 2000 матюгается на KERNEL32.DLL типа нет там такой функции, но я ведь проверяю что если не 9х то ничего такого не трогать
← →
Term © (2004-06-02 15:54) [6]
> Bar (02.06.04 15:50) [4]
спасибо буду пробывать
← →
Bar (2004-06-02 15:58) [7]От проверки зависит, вызовешь ли ты эту функцию или нет, а при загрузки твоего exe-ка всю равно будет искаться RegisterServiceProcess в "KERNEL32.DLL", так как ты её подключил статически.
При статическом подключении адрес функции находится то-ли в момент компиляции,то-ли при запуске exe-ка (безо всяких проверок на версию винды) и вот тут возникает ошибка.
← →
Bar (2004-06-02 16:00) [8]При таком (function RegisterServiceProcess(dwProcessID, dwType: Integer): Integer; stdcall;
external "KERNEL32.DLL";) определении метода DLL будет загружена немедленно после старта приложения и выгружена вместе с его завершением. В приведенном выше примере следует обратить внимание на то, что после имени динамической библиотеки указано ее расширение (FirstLib.dll). Такая конструкция необходима для загрузки библиотеки в Windows NT, поскольку без расширения *.dll файл не будет найден! В Windows 95 расширение не обязательно.
При поиске DLL для загрузки первоначально определяется, была ли данная DLL уже загружена в память другим модулем. Если была — то извлекается адрес метода и передается приложению. Если же нет — то операционная система начинает ее поиск на диске. При этом, если путь при имени DLL не указан в явном виде, система ищет библиотеку в каталоге модуля, который старается загрузить DLL. Если не находит, то продолжает поиски в директориях WINDOWS и WINDOWS\SYSTEM (или WINNT, WINNT\SYSTEM, WINNT\SYSTEM32). После этого происходит поиск в каталогах, определенных в переменной среды Path. Если библиотека с заданным именем будет найдена, то она загрузится и приложение стартует. Если же нет — происходит исключение и приложение прекратит свою работу. Приложение прекращает работу также и в том случае, если не будет найден метод с данным именем (или индексом, если он импортируется по индексу).
Динамическая загрузка DLL позволяет загружать библиотеку только в тот момент, когда она требуется. Кроме того, если не будет найдена библиотека или метод, то это можно проанализировать и запустить приложение и в этом случае. Конечно, в такой ситуации следует информировать пользователя о невозможности вызвать метод из DLL — например, сделав невидимым элемент меню, который обращается к данному методу. Пример динамической загрузки DLL выглядит следующим образом:
см Bar (02.06.04 15:50) [4]
← →
Yanis © (2004-06-02 20:28) [9]Извиняюсь, надо вызывать <>динамически</>!
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.07.11;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.034 c