Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.02.2008, 06:04   #1
eks-s
Пользователь
 
Регистрация: 15.01.2008
Сообщений: 64
По умолчанию Проблема с программой

Помогите, пожалуйста! Подскажите в чём проблема?!

Постановка задачи: Программа запускается с ограниченной учётной записи и запускает некоторые команды с правами администратора (работа на системном диске: удаление папок, извлечение ресурсов, запуск sfx-архива).

Проблема: Имя и пароль беру с файла. Запускаю процесс с правами админа. Выдаёт ислючение, обычно при вызыве второй формы.

Пожалуйста пожскажите как всё это сделать, потому что делаю всё в первый раз, так сказать методом проб и ошибок!

Код:
type
  TMyInfo = record
    user  : string[20];
    passw : string[30];
  end;
var
  MyInfo : TMyInfo;
  user : PWideChar;
  passw : PWideChar;
  si : Tstartupinfo;
  pi : Tprocessinformation;
Код:
function CreateProcessWithLogonW(user:pwidechar; domain:pwidechar;
passw:pwidechar; flags: DWORD; lpApplicationName: PwideChar; lpCommandLine: PwideChar;
dwCreationFlags: DWORD; lpEnvironment: Pointer;
lpCurrentDirectory: PWideChar; const lpStartupInfo: TStartupInfo;
var lpProcessInformation: TProcessInformation): BOOL; stdcall;external 'advapi32.dll' name 'CreateProcessWithLogonW';

Код:
// процедура Удаление указанных папок
procedure DelDir(DirPath : TStringList);
var
  S : string;
  i : integer;
  param: PWideChar;
begin
MainForm.memoLog.Lines.Add('права администратора');
  // String To PWideChar (имя и пароль админа)
  GetMem(user,Length(MyInfo.user)+1);
  StringToWideChar(MyInfo.user,user,Length(MyInfo.user)+1);
  GetMem(passw,Length(MyInfo.passw)+1);
  StringToWideChar(MyInfo.passw,passw,Length(MyInfo.passw)+1);

  //составление командной строки для удаления папок
  // DirPath[i] содержит 'C:\MyProgTemp\'
  S := 'cmd.exe /c "';
  for i := 0 to DirPath.Count-1 do
    if DirectoryExists(DirPath[i]) then
      S := S + 'RMDIR '+DirPath[i]+' /s /q && ';
  S := S + 'ECHO."'; // получили cmd.exe /c "RMDIR C:\MyProgTemp\ /s /q && ECHO."

  GetMem(param,Length(S)+1);   // S > param (String To PWideChar)
  StringToWideChar(S,param,Length(S)+1);

  FillChar(Si,SizeOf(Si),0);
  si.cb := SizeOf(si);
  si.dwFlags := STARTF_USESHOWWINDOW;
  si.wShowWindow := SW_SHOWDEFAULT;
  si.lpReserved := nil;
  si.lpDesktop := nil;
  si.lpTitle := nil;
	//Запускаем процесс и ждём завершеия
  CreateProcessWithLogonW(user,nil,passw,0,nil,
      param,0,nil,nil,si,pi);
  Waitforsingleobject(pi.hProcess,infinite);
  Application.Restore;
  FreeMem(param);
  FreeMem(user);
  FreeMem(passw);
end;

procedure TMainForm.Button1Click(Sender: TObject);
begin
  Finishform.ShowModal;
end;
eks-s вне форума Ответить с цитированием
Старый 05.02.2008, 08:02   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Выдаёт ислючение, обычно при вызыве второй формы.
А каким боком в приведенном тобой примере используется твоя DelDir?
И что происходит при показе и создании второй формы?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.02.2008, 01:02   #3
eks-s
Пользователь
 
Регистрация: 15.01.2008
Сообщений: 64
По умолчанию

Вот так используется. У меня две идентичных процедуры DelOldDir и DelTempDir

Код:
//Удаление старых папок
procedure DelOldDirs;
var
  DirPath : TStringList;
begin
  dirPath := TStringList.Create;
if DirectoryExists('C:\MyProgTemp\') then
  DirPath.Add('C:\MyProgTemp\');
if DirectoryExists('C:\MyProgSettings\') then
  DirPath.Add('C:\MyProgSettings\');
if dirPath.Count > 0 then
  DelDir(DirPath);
  dirPath.Free;
end;

Последний раз редактировалось eks-s; 06.02.2008 в 01:07.
eks-s вне форума Ответить с цитированием
Старый 06.02.2008, 01:15   #4
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Есть подозрение вот на эту строку:
GetMem(param,Length(S)+1); (23-я в первом посте)
Памяти выделяется в два раза меньше, чем надо
B_N вне форума Ответить с цитированием
Старый 06.02.2008, 01:51   #5
eks-s
Пользователь
 
Регистрация: 15.01.2008
Сообщений: 64
По умолчанию

Вторая форма:

1. OnCreate
- вызывается функция считывающая текстовый файл update.ver, ищет в нём заданную строку содержащую номер версии
- номер присваивается переменной

2. OnActive
- После выполнения всей программы старый файл update.ver удаляется и создаётся новый.
- вызываю ту же функцию и узнаю номер версии уже с нового файла.
- сравниваю два значения старого и нового
- Заполняю надписи на форме

Самое интересное, удалил абсолютно всё со второй формы чтоб она просто появлялась ничего не делая и всё стало работать. Насколько стабиль ещё не знаю, щас проверяю...


Цитата:
Есть подозрение вот на эту строку:
GetMem(param,Length(S)+1); (23-я в первом посте)
Памяти выделяется в два раза меньше, чем надо
А как нужно? Я просто где то примеры использования читал, там так указывалось
eks-s вне форума Ответить с цитированием
Старый 06.02.2008, 02:33   #6
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Алексей eks-s ^ii^ Посмотреть сообщение
А как нужно? Я просто где то примеры использования читал, там так указывалось
Ну, насколько я понимаю, StringToWideChar - это некий аналог MultiByteToWideChar, в таком случае GetMem здесь выделяет блок длиной (Length(S) + 1) байт, а MultiByteToWideChar ждет буфер длиной (Length(S) + 1) WideChar'ов т.е. слов (на самом деле, она сама говорит, сколько ей нужно, если ее вызвать с нулевыми параметрами)
----------
Да, чуть не забыл, а что трассировка-то вообще показывает?
B_N вне форума Ответить с цитированием
Старый 06.02.2008, 02:49   #7
eks-s
Пользователь
 
Регистрация: 15.01.2008
Сообщений: 64
По умолчанию

Цитата:
Сообщение от B_N Посмотреть сообщение
Ну, насколько я понимаю, StringToWideChar - это некий аналог MultiByteToWideChar, в таком случае GetMem здесь выделяет блок длиной (Length(S) + 1) байт, а MultiByteToWideChar ждет буфер длиной (Length(S) + 1) WideChar'ов т.е. слов (на самом деле, она сама говорит, сколько ей нужно, если ее вызвать с нулевыми параметрами)
Я так понял что WideChar длиной отличается от String'а только наличием нолика в конце. Если я не прав, как тогда определить необходимую длину?

Цитата:
Сообщение от B_N Посмотреть сообщение
Да, чуть не забыл, а что трассировка-то вообще показывает?
Эт Вы про что? ))
eks-s вне форума Ответить с цитированием
Старый 06.02.2008, 02:54   #8
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Не знаю, как там насчёт дельфового WideChar'а, но функции API, которые заканчиваются на ....W (CreateProcessWithLogonW в нашем случае) - это юникод-версии, которые берут двухбайтные символы.

Цитата:
Эт Вы про что? ))
Ну как..... про дебаг..... Вот тут
Цитата:
Выдаёт ислючение, обычно при вызыве второй формы
хотя бы чего говорит?
B_N вне форума Ответить с цитированием
Старый 06.02.2008, 03:10   #9
eks-s
Пользователь
 
Регистрация: 15.01.2008
Сообщений: 64
По умолчанию

Всё, заработало. Ошибка возникала после запуска SFX-архива и потом удаления папки с ним. строчку лишнюю забыл удалить.
Процесс с права запускался только со второго раза (??!!). Поставил везде GetMem(user,2*Length(MyInfo.user)+1 ); и заработало как надо
Щас попробую опять всё вместе собрать как было. Надеюсь не рано радуюсь, а то уже три недели колдую
eks-s вне форума Ответить с цитированием
Старый 06.02.2008, 09:47   #10
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Алексей eks-s ^ii^ предупреждение за ник.
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите с программой 1234 Общие вопросы Delphi 2 21.04.2008 10:50
У меня тут проблема с программой MAKEDON Свободное общение 1 10.03.2008 23:16
проблема с программой dima00 Общие вопросы Delphi 2 20.11.2007 13:56
Проблема с программой Dues Помощь студентам 1 19.11.2007 01:46