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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.07.2018, 13:29   #1
Fakov
Пользователь
 
Регистрация: 13.12.2009
Сообщений: 85
По умолчанию Не регистрирует класс

И еще раз привет знатокам.
Преследую цель - перестать регистрировать ocx библиотеку на машинах пользователей через батник, хочу, чтобы программа делала это при запуске. Если это возможно.

Вот такую структуру запускаю на событии создания главной формы:

Код:
//============================================================== REGSVR32
function TForm1.IsWow64: BOOL;
type
  TIsWow64Process = function(hProcess: THandle;
    var Wow64Process: BOOL): BOOL; stdcall;
var
  IsWow64Process: TIsWow64Process;
begin
  Result := False;
  @IsWow64Process := GetProcAddress(GetModuleHandle(kernel32),
    'IsWow64Process');
  if Assigned(@IsWow64Process) then
    IsWow64Process(GetCurrentProcess, Result);
end;

function TForm1.ExecAndWait(const ExecuteFile, ParamString : string): boolean;
var
  SEInfo: TShellExecuteInfo;
  ExitCode: DWORD;
begin
  FillChar(SEInfo, SizeOf(SEInfo), 0);
  SEInfo.cbSize := SizeOf(TShellExecuteInfo);
  with SEInfo do begin
    fMask := SEE_MASK_NOCLOSEPROCESS;
    Wnd := Application.Handle;
    lpFile := PChar(ExecuteFile);
    lpParameters := PChar(ParamString);
    nShow := SW_HIDE;
  end;
  if ShellExecuteEx(@SEInfo) then
  begin
    repeat
      Application.ProcessMessages;
      GetExitCodeProcess(SEInfo.hProcess, ExitCode);
    until (ExitCode <> STILL_ACTIVE) or Application.Terminated;
    Result:=True;
  end
  else Result:=False;
end;


procedure TForm1.RegisterOCX;
type
  TRegFunc = function : HResult; stdcall;
var
  ARegFunc : TRegFunc;
  aHandle  : THandle;
  ocxPath  : string;
begin
  ocxPath := ExtractFilePath(Application.ExeName) + 'MpqCtl.ocx';
  aHandle := LoadLibrary(PChar(ocxPath));
  if aHandle <> 0 then
  begin
    ARegFunc := GetProcAddress(aHandle,'DllRegisterServer');
    if Assigned(ARegFunc) then
    begin
      if IsWow64 then
        ExecAndWait('C:\Windows\SysWOW64\regsvr32','/s ' + ocxPath)
        else
        ExecAndWait('C:\Windows\System32\regsvr32','/s ' + ocxPath)
    end;
    FreeLibrary(aHandle);
  end;
  ShowMessage(Format('Error registering %s', [ocxPath]));
 end;

//============================================================== REGSVR32
Вероятно, знатоки быстрым взглядом найдут ошибку и подскажут - что не так здесь и как нужно исправить, чтобы при запуске программы не ловить эксепшн с надписью "EOleSysError - Класс не зарегистрирован"

Спасибо.
Fakov вне форума Ответить с цитированием
Старый 30.07.2018, 13:43   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

а если просто в батнике выполнить
Код:
regsvr32 /s <ПолныйПутькOCX>
Serge_Bliznykov вне форума Ответить с цитированием
Старый 30.07.2018, 13:56   #3
Fakov
Пользователь
 
Регистрация: 13.12.2009
Сообщений: 85
По умолчанию

Через батник работает все. Но цель то - избавить пользователя от необходимости сначала запускать батник, а потом экзешник.
Fakov вне форума Ответить с цитированием
Старый 30.07.2018, 14:15   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Fakov Посмотреть сообщение
Через батник работает все. Но цель то - избавить пользователя от необходимости сначала запускать батник, а потом экзешник.
понятно.
А что сложного в том, чтобы в начале EXE-шника проверить наличие нужного класса, если его нет - выдать сообщение пользователю и выйти?!
И пользователю, имхо, несложно будет один раз запустить батник.


Тогда я вряд ли подскажу, в чём проблема с вашим кодом для регистрации.
Один только совет. Попробуйте запустить ваш EXEшник регистрации с правами администратора (правой кнопкой мышки на exe - "Запуск от имени администратора"). Может быть, прав не хватает.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 30.07.2018, 15:09   #5
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

и можно обойтись без regsvr32...
ocx это длл с 4 функциями одна из которых DllRegisterServer...
делаем лоадлиб, гетпрокадр('регистер'), регистер
или одной строкой ComObj.RegisterComServer('MpqCtl.oc x');
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 30.07.2018, 15:19   #6
Fakov
Пользователь
 
Регистрация: 13.12.2009
Сообщений: 85
По умолчанию

Вон даже как...
Спасибо, попробую обязательно, отпишусь
Fakov вне форума Ответить с цитированием
Старый 04.08.2018, 12:08   #7
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,770
По умолчанию

Цитата:
Сообщение от Slym Посмотреть сообщение
или одной строкой ComObj.RegisterComServer('MpqCtl.oc x');
Угу. Надо было сначала в справке посмотреть. Ибо странно, если бы в модулях поддержки COM не реализовали такую полезную вещь... Я вот или не знал про существование этой процедуры, или забыл. Давно уже с COM не работал.
Vapaamies вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно сделать наследование классов, 1 класс находится первой форме, 2 класс во второй. Вероника99 Помощь студентам 3 29.04.2016 23:02
Не регистрирует библиотеку stenl1 Windows 7 10.08.2015 21:51
Не регистрирует класс окна Zooma Win Api 2 04.06.2013 15:10
Добавить класс в проект2,похожий на класс из проекта1!оба проекта есть! xeops C# (си шарп) 0 15.05.2012 20:31
Класс запускает поток, который заполняет этот класс. Обмен класс <=> поток. Человек_Борща Общие вопросы Delphi 8 27.02.2012 23:24