CreateProcess и UAC
От: DDS  
Дата: 05.09.11 05:06
Оценка:
Вообщем ситуация такая. Из своей программы запускаю другую свою прогу CreateProcessОМ.

Программа запускается, но:
1) не хочет открываться ни один диалог (открытия, сохранения файлов), ошибок не вызывает, просто .Execute() проглатывает и ничего не происходит.
2) не хочет работать с COM/OLE

Предполагаю, что у программы нет прав. Ситуация осложняется тем, что запуск идет след. образом:

1) Запусается 1С с правами администратора
2) 1С вызывает dll-ку (внешняя компонента)
3) dll-ка запусает приложение CreateProcessОМ

Всегда все работало, а вот на конкретном компьютере с вин7 не хочет.
Предполагаю что виноват UAC, хотя он был мною отключен. Полностью.

Кусок кода:


procedure StartExeProccess;
var
  si: TSTARTUPINFO;
  pi: TPROCESSINFORMATION;
  env: array[0..100] of Char;
begin
  ZeroMemory(@env, SizeOf(env));
  ZeroMemory(@si, SizeOf(si));
  ZeroMemory(@pi, SizeOf(pi));
  R:=CreateProcess(nil, Pchar('"'+DirPath+ExeName+'" "'+datafile_name+'"'), nil, nil, false, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, PChar(DirPath), si, pi);
  if R then piddd:=pi.dwProcessId;
  wait:=false;

  if R then
  begin
    WaitForSingleObject(pi.hProcess, INFINITE);
    MyAddIn.EventStart('СохранениеДанных', 'proc_id='+inttostr(pi.dwProcessId)+'|datafile='+datafile_name);
    CloseHandle(pi.hThread);
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
    killed:=true;
  end;
end;
Re: CreateProcess и UAC
От: DM.PROFF Россия  
Дата: 05.09.11 08:51
Оценка:
Здравствуйте, DDS, Вы писали:

DDS>
DDS>procedure StartExeProccess;
DDS>var
DDS>  si: TSTARTUPINFO;
DDS>  pi: TPROCESSINFORMATION;
DDS>  env: array[0..100] of Char;
DDS>begin
DDS>  ZeroMemory(@env, SizeOf(env));
DDS>  ZeroMemory(@si, SizeOf(si));
DDS>  ZeroMemory(@pi, SizeOf(pi));
DDS>  R:=CreateProcess(nil, Pchar('"'+DirPath+ExeName+'" "'+datafile_name+'"'), nil, nil, false, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, PChar(DirPath), si, pi);
DDS>  if R then piddd:=pi.dwProcessId;
DDS>  wait:=false;

DDS>  if R then
DDS>  begin
DDS>    WaitForSingleObject(pi.hProcess, INFINITE);
DDS>    MyAddIn.EventStart('СохранениеДанных', 'proc_id='+inttostr(pi.dwProcessId)+'|datafile='+datafile_name);
DDS>    CloseHandle(pi.hThread);
DDS>    CloseHandle(pi.hProcess);
DDS>    CloseHandle(pi.hThread);
DDS>    killed:=true;
DDS>  end;
DDS>end;

DDS>


Не инициализирован размер структуры si
Добавьте перед CreateProcess


si.cb := SizeOf (si);

R:=CreateProcess(nil, Pchar('"'+DirPath+ExeName+'" "'+datafile_name+'"'), nil, nil, false, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, PChar(DirPath), si, pi);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.