Вообщем ситуация такая. Из своей программы запускаю другую свою прогу 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;
Здравствуйте, 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);