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

Вниз

Скрытие процесса   Найти похожие ветки 

 
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 вся ветка

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

Наверх




Память: 0.49 MB
Время: 0.039 c
1-1088510781
Alex_2004
2004-06-29 16:06
2004.07.11
Ориентация страницы в MS Word


14-1087808659
_student
2004-06-21 13:04
2004.07.11
С помощью Asembler надо вытащить системную дату


1-1088054119
Pasha
2004-06-24 09:15
2004.07.11
Народ, подскажите плз. как мне дописать сводку к файлу


1-1088449248
Godness
2004-06-28 23:00
2004.07.11
Объеденить ячейки в Excel e


1-1088143417
denik
2004-06-25 10:03
2004.07.11
PHP --> Delphi