Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
|
[Win32] Вызов функции в Delphi 03.04.03 21:54 Число просмотров: 1296
Автор: Fighter <Vladimir> Статус: Elderman
|
Я извиняюсь если это уже есть в нитке, но у меня сегодня канал постоянно падает, поэтому дальше я не полез. Внешние процедуры вызываются так:
procedure RegisterServiceProcess; external 'kernel32.dll' name 'RegisterServiceProcess'
или так:
function OpenThread(dwDesiredAccess: Longword; bInheritHandle: BOOL; dwThreadId: Longword): THandle; stdcall; external 'Kernel32.dll';
может и еще что-то есть, но мне об этом неизвестно.
|
<programming>
|
[Win32] Вызов функции в Delphi 01.04.03 12:28
Автор: _Inquisitor_ Статус: Незарегистрированный пользователь
|
Доброе время суток!
Кто-нибудь сталкивался с функцией CreateProcessWithLogonW (она находится в advapi.dll)? Проблема в следующем... Мне необходимо вызвать ее из Delphi. Что я делаю: описываю ее прототип (нет ее в windows.dcu), и потом делаю ее вызов. В результате вылетает ошибка в либе ntdll.dll (Access violation at adress .... in module ntdll.dll. Read of adress....)/
ниже приведены исходнички
function CreateProcessWithLogonW(
lpUsername: WideString; // user's name
lpDomain: WideString; // user's domain
lpPassword: WideString; // user's password
dwLogonFlags: DWORD; // logon option
lpApplicationName: WideString; // executable module name
lpCommandLine: WideString; // command-line string
dwCreationFlags: DWORD; // creation flags
lpEnvironment: WideString; // new environment block
lpCurrentDirectory: WideString; // current directory name
lpStartupInfo: windows.STARTUPINFO; // startup information
lpProcessInfo: windows.PROCESS_INFORMATION // process information
): boolean; external 'advapi32.dll';
.........
procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
Username, Domain, passwrd, CommandLine: WideString;
Token: DWORD;//PHanndle
start: windows.STARTUPINFO;
proc_info: windows.PROCESS_INFORMATION;
begin
Username:='User0';
passwrd:='';
CommandLine:='c:\winnt\system32\cscript.exe d:\Scripts\del_u.vbs >> user0.txt';
if not CreateProcessWithLogonW(
UserName, // user's name
Domain, // user's domain
Passwrd, // user's password
0, // logon option
'', // executable module name
CommandLine, // command-line string
windows.CREATE_DEFAULT_ERROR_MODE, // creation flags
'', // new environment block
'', // current directory name
start, // startup information
proc_info // process information
)then ShowMessage('ОБЛОМ :-(((');
end;
---
ошибка вылазит при вызове ф-ии.
Кто-нибудь сталкивался с подобной проблемой?
заранее сенькс.
|
|
[Win32] Вызов функции в Delphi 03.04.03 21:54
Автор: Fighter <Vladimir> Статус: Elderman
|
Я извиняюсь если это уже есть в нитке, но у меня сегодня канал постоянно падает, поэтому дальше я не полез. Внешние процедуры вызываются так:
procedure RegisterServiceProcess; external 'kernel32.dll' name 'RegisterServiceProcess'
или так:
function OpenThread(dwDesiredAccess: Longword; bInheritHandle: BOOL; dwThreadId: Longword): THandle; stdcall; external 'Kernel32.dll';
может и еще что-то есть, но мне об этом неизвестно.
|
| |
Есть еще LoadLibrary и GetProcAddress 03.04.03 22:16
Автор: Killer{R} <Dmitry> Статус: Elderman
|
|
|
на C это делаю так 01.04.03 15:22
Автор: Killer{R} <Dmitry> Статус: Elderman
|
PROCESS_INFORMATION pi;
STARTUPINFOW siw;
memset(&siw,0,sizeof(siw));
siw.cb=sizeof(siw);
MultiByteToWideChar(CP_ACP,0,domm,-1,dom,256);//это чтобы в unicode
MultiByteToWideChar(CP_ACP,0,usrm,-1,usr,256);
MultiByteToWideChar(CP_ACP,0,pasm,-1,pas,256);
MultiByteToWideChar(CP_ACP,0,cmdm,-1,cmd,256);
CreateProcessWithLogonW(usr,dom,pas,1,0,cmd,0x400,0,0,&siw,&pi);
и работает.
|
|
Забыт stdcall 01.04.03 15:18
Автор: leo <Леонид Юрьев> Статус: Elderman Отредактировано 01.04.03 15:19 Количество правок: 1
|
Нужно чуть-чуть поправить:function CreateProcessWithLogonW(
lpUsername: WideString; // user's name
lpDomain: WideString; // user's domain
lpPassword: WideString; // user's password
dwLogonFlags: DWORD; // logon option
lpApplicationName: WideString; // executable module name
lpCommandLine: WideString; // command-line string
dwCreationFlags: DWORD; // creation flags
lpEnvironment: WideString; // new environment block
lpCurrentDirectory: WideString; // current directory name
lpStartupInfo: windows.STARTUPINFO; // startup information
lpProcessInfo: windows.PROCESS_INFORMATION // process information
): boolean; stdcall; external 'advapi32.dll'; ---
|
| |
И вот еще 02.04.03 10:24
Автор: leo <Леонид Юрьев> Статус: Elderman Отредактировано 02.04.03 10:25 Количество правок: 1
|
Не обратил внимания, нужно не WideString, а PWideChar и при вызове делать явное преобразование PWideChar(Text). Компилятор все сделает сам.CreateProcessWithLogonW(
lpUsername: PWideChar; // user's name
lpDomain: PWideChar; // user's domain
lpPassword: PWideChar; // user's password
dwLogonFlags: DWORD; // logon option
lpApplicationName: PWideChar; // executable module name
lpCommandLine: PWideChar; // command-line string
dwCreationFlags: DWORD; // creation flags
lpEnvironment: PWideChar; // new environment block
lpCurrentDirectory: PWideChar; // current directory name
lpStartupInfo: windows.STARTUPINFO; // startup information
lpProcessInfo: windows.PROCESS_INFORMATION // process information
): boolean; stdcall; external 'advapi32.dll'; ---
|
| | |
И вот еще 02.04.03 10:50
Автор: _Inquisitor_ Статус: Незарегистрированный пользователь Отредактировано 02.04.03 11:29 Количество правок: 1
|
> ): boolean; stdcall; external > 'advapi32.dll';
а разве имеет значение в каком порядке следуют
stdcall; и external?
и еще такой вопрос...
Кто-нибудь пытался запустить одну и ту же прогу от имени нескольких разных пользователей? Скажем в системе есть 100 пользователей с именами User1..User100. От имени каждого из них надо запустить прогу с некоторыми входными параметрами...
У кого-нибудь был опыт решения подобных задач? поделитесь плз.
|
| | | |
И вот еще 02.04.03 11:45
Автор: Sandy <Alexander Stepanov> Статус: Elderman
|
> а разве имеет значение в каком порядке следуют > stdcall; и external?
Порядок значения не имеет
> и еще такой вопрос... > Кто-нибудь пытался запустить одну и ту же прогу от имени > нескольких разных пользователей? Скажем в системе есть 100 > пользователей с именами User1..User100. От имени каждого из > них надо запустить прогу с некоторыми входными > параметрами... > У кого-нибудь был опыт решения подобных задач? поделитесь > плз.
Может быть сделать батник и через RunAs...
|
| | | | |
И вот еще 02.04.03 13:07
Автор: _Inquisitor_ Статус: Незарегистрированный пользователь
|
> > а разве имеет значение в каком порядке следуют > > stdcall; и > external? > > Порядок значения не имеет > Вот только что попробовал поменять их местами.... Оказалось что ворядок имеет значение....
|
| | | | | |
И вот еще 02.04.03 13:37
Автор: leo <Леонид Юрьев> Статус: Elderman
|
Порядок определяется синтаксисом Delphi.
И еще, вот это
CommandLine:='c:\winnt\system32\cscript.exe d:\Scripts\del_u.vbs >> user0.txt';
- не сработает.
Если нужно сделать перенаправление в файл, то запускай cmd.exe
Или перенаправь выход ручками.
Если оставить как есть, но cscript.exe просто получит три параметра 'd:\Scripts\del_u.vbs', '>>' и 'user0.txt'.
|
| | | | | | |
И вот еще 02.04.03 13:41
Автор: _Inquisitor_ Статус: Незарегистрированный пользователь
|
> И еще, вот это > CommandLine:='c:\winnt\system32\cscript.exe > d:\Scripts\del_u.vbs >> user0.txt'; > - не сработает. > > Если нужно сделать перенаправление в файл, то запускай > cmd.exe > Или перенаправь выход ручками. > Если оставить как есть, но cscript.exe просто получит три > параметра 'd:\Scripts\del_u.vbs', '>>' и > 'user0.txt'. Да тут не играет роли что выполнять, главное как это будет выполняться....
Но все равно спасибо за совет
|
|
|