Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Не регистрируется dll x64, Не регистрируется dll x64 delphi XE2 
V
    Опции темы
ZBugz
  Дата 14.10.2011, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



Хочу зарегистрировать dll в системе, а не пашет если dll x64 
Тупо не срабатывает LoadLibrary, если dll компильнута на 64 бит...
Код

uses shellapi;
...
function 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 RegisterOCX;
type
 TRegFunc = function : HResult; stdcall;
var
 ARegFunc : TRegFunc;
 aHandle  : THandle;
 ocxPath  : string;
begin
try
 ocxPath := ExtractFilePath(Application.ExeName) + 'Flash.ocx';
 aHandle := LoadLibrary(PChar(ocxPath));
 if aHandle <> 0 then
 begin
   ARegFunc := GetProcAddress(aHandle,'DllRegisterServer');
   if Assigned(ARegFunc) then
   begin
     ExecAndWait('regsvr32','/s ' + ocxPath);
   end;
   FreeLibrary(aHandle);
 end;
except
 ShowMessage(Format('Не могу зарегистрировать %s', [ocxPath]));
end;
end;

Как быть ? smile 
PM MAIL   Вверх
Akella
Дата 14.10.2011, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Цитата(ZBugz @  14.10.2011,  16:30 Найти цитируемый пост)
regsvr32

Это ж 32х битная версия регистратора, нет?

Добавлено через 1 минуту и 27 секунд
Ты хоть бы погуглил, а?

Добавлено через 1 минуту и 55 секунд
Первая ссылка, несколько секунд затрачено на поиск:
http://social.msdn.microsoft.com/forums/en...3-20c63f71a2d8/

Цитата

A 32-bit process cannot load a 64-bit DLL.  Look for a regsvr64 (just a guess) to register a 64-bit COM DLL.


Добавлено через 2 минуты и 22 секунды
http://support.microsoft.com/kb/282747
PM MAIL   Вверх
ZBugz
Дата 14.10.2011, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



Цитата(Akella @ 14.10.2011,  16:38)
Цитата(ZBugz @  14.10.2011,  16:30 Найти цитируемый пост)
regsvr32

Это ж 32х битная версия регистратора, нет?

Добавлено @ 16:39
Ты хоть бы погуглил, а?

Добавлено @ 16:40
Первая ссылка, несколько секунд затрачено на поиск:
http://social.msdn.microsoft.com/forums/en...3-20c63f71a2d8/

Цитата

A 32-bit process cannot load a 64-bit DLL.  Look for a regsvr64 (just a guess) to register a 64-bit COM DLL.


Добавлено @ 16:40
http://support.microsoft.com/kb/282747

Да это тут причем, я говорю не пашет LoadLibraryW с dll x64
А regsvr32.exe в x64 windows он так и остался, только для x64 он в одной папке C:\Windows\System32\, а для x86 он в другой C:\Windows\SysWOW64\, а название файла такое же и осталось.

Добавлено @ 16:49
Если dll x86 то все пашет.

Это сообщение отредактировал(а) ZBugz - 14.10.2011, 16:50
PM MAIL   Вверх
Akella
Дата 14.10.2011, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



А ты уверен, что запускается именно из папки C:\Windows\SysWOW64\ ?
PM MAIL   Вверх
ZBugz
Дата 14.10.2011, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



Цитата(Akella @ 14.10.2011,  16:59)
А ты уверен, что запускается именно из папки C:\Windows\SysWOW64\ ?

Конечно, я просто еще функцию написал, которая выдает для x86 и x64 нужные файлы.
Тут смотри, проблема то в этом aHandle := LoadLibrary(PChar(ocxPath));
У меня aHandle = 0, если dll компильнута под x64, ставлю еёже и x86 (тупо перекомпильнув под x86), она грузится и aHandle уже не равен 0. Т.е. тупо не срабатывает процедура LoadLibrary 
Так что мне до regsvr32.exe еще далеко smile

Добавлено через 13 минут и 35 секунд
Усе, проверил. Так как приложение x86 то и нефига не пашет :( 
Как быть ?

Это сообщение отредактировал(а) ZBugz - 14.10.2011, 17:10
PM MAIL   Вверх
bems
Дата 14.10.2011, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Тебе ж ясно сказали что тридцатидвухбитную длл нельзя загрузить в шестидесятичетырехбитный процесс и наоборот.
Цитата(ZBugz @  14.10.2011,  17:09 Найти цитируемый пост)
Как быть ?
а) использовать regsvr32 вместо загрузки длл в свой процесс
б) для работы с шестидесятичетырехбитными дллками компилировать свой проект под х64 (используя дельфи ХЕ2)


--------------------
Обижено школьников: 8
PM MAIL   Вверх
ZBugz
Дата 14.10.2011, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



Я пока выход только один нашел, сделал еще exe x64, консольный и там сделал ту функцию. Когда надо зарегить dll в системе, вызываю это exe, в который отдал все что касается x64. 
Заодно все функции для x64 туда вынес
PM MAIL   Вверх
bems
Дата 14.10.2011, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



да зачем там вообще эта проверка? делай сразу ExecAndWait


--------------------
Обижено школьников: 8
PM MAIL   Вверх
northener
Дата 15.10.2011, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 8
Всего: 20



<offtop>
О как здорово было бы объединить "Исходники" с "Винградом", чтобы можно было бы видеть все ответы на одной странице!
</offtop>
P.S. Можно, конечно, объединить и с ДМ, но тут будет много возражений. smile


 ! 
bems
Использование тега offtop само по себе еще не даёт разрешения оффтопить в тематике. Закрою во избежание


Это сообщение отредактировал(а) bems - 15.10.2011, 01:02


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
  
Закрытая темаСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0671 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.