Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.037 c
3-1086415021
Sour
2004-06-05 09:57
2004.07.11
Invalid blob id


1-1088072674
Anatoliy
2004-06-24 14:24
2004.07.11
Распаковать буфер


1-1088587619
XeLax
2004-06-30 13:26
2004.07.11
Глючная структура


3-1087287584
Паниковский
2004-06-15 12:19
2004.07.11
Insert


14-1087918740
Knight
2004-06-22 19:39
2004.07.11
С кем поведёшься...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский