![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
В чём фишка ? [D7, XP]
KGC © (2005-11-23 07:59:00)Здравствуйте уважаемые.
Подскажите в чём же фишка, перечитал не одну статью по загрузке DLL
из ключика реестра Software\Microsoft\Windows\CurrentVersion\ShellServiceObjectDelayLoad
всё бы хорошо да не очень, при загрузке dll выдаёться ошибка
System error. code: 1400.
Недопустимый дескриптор окна.
Dll у мя пустая совсем, пробывал делать и не пустую dll та же фигня.
Нашёл небольшой выход когда мы подключаем Forms и создаём окно то всё окей, ошибка исчезает. Но Forms таскать за собой совершенно не хочеться. Что тут можно предпринять ? Заранее спасибо.
Джо (2005-11-23 22:05:00) [1]Задает "главную функцию" библиотеки. Если точка входа в эту функцию определена, она вызывается системой при загрузке и выгрузке библиотеки. Т.е, когда библиотека загружается и выгружается функциями LoadLibrary & FreeLibrary. Параметр dwReason, кроме перечисленных Дигитмэном в cas'е может принимать такие значения: DLL_THREAD_ATTACH, DLL_THREAD_DETACH.
За подробностями обращайтесь к Справочной системе Делфи (глоб. переменная DLLProc) и MSDN (callback-функция DllMain).
KGC (2005-11-23 21:16:00) [2]Хм знаете как ни странно затестил на другом компьютере SP SP2 поставлен с того же диска что и у меня, всё работает отлично.
Digitman, спасибо большое за помощь только ещё один вопрос,
а что делает этот код :
procedure DllMain(dwReason: DWord);
begin
case dwReason of
DLL_PROCESS_ATTACH:
begin
end;
DLL_PROCESS_DETACH:
begin
end;
end;
end;
begin
DllProc := @DllMain;
DllMain(DLL_PROCESS_ATTACH);
end.
Digitman (2005-11-23 12:27:00) [3]не знаю.
у меня все расчудесно работает (Win2000 SP4, D7)
вот мною оттестированный код, принципиально ничем не отличающийся от твоего:
DLL:
library MyDLL;
uses
Windows,
Messages,
SysUtils,
Classes,
Dialogs;
procedure Test;
begin
end;
procedure DllMain(dwReason: DWord);
begin
case dwReason of
DLL_PROCESS_ATTACH:
begin
end;
DLL_PROCESS_DETACH:
begin
end;
end;
end;
exports Test;
begin
DllProc := @DllMain;
DllMain(DLL_PROCESS_ATTACH);
end.
юнит формы в exe, регистрирующего и удаляющего регистрацию dll:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button3: TButton;
Button1: TButton;
procedure Button3Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
uses ActiveX, Registry;
function CreateClassID: string;
var
ClassID: TGUID;
P: PWideChar;
begin
CoCreateGuid(ClassID);
StringFromCLSID(ClassID, P);
Result := P;
CoTaskMemFree(P);
end;
procedure UnregisterDLL(name:string);
var
reg:Tregistry;
CLSID:string;
begin
reg:=Tregistry.create;
reg.rootkey:=HKEY_LOCAL_MACHINE;
reg.openkey('Software\Microsoft\Windows\CurrentVersion\ShellServiceObjectDelayLoad', true);
CLSID := reg.ReadString(name);
reg.DeleteValue(name);
reg.closekey;
reg.rootkey:=HKEY_CLASSES_ROOT;
reg.DeleteKey('CLSID\'+CLSID);
reg.closekey;
end;
function RegisterDLL(name:string; tolocal:string):string;
var
reg:Tregistry;
CLSID:string;
begin
reg:=Tregistry.create;
reg.rootkey:=HKEY_LOCAL_MACHINE;
reg.openkey('Software\Microsoft\Windows\CurrentVersion\ShellServiceObjectDelayLoad', true);
CLSID:=CreateClassID;
reg.writestring(name, CLSID);
reg.closekey;
reg.rootkey:=HKEY_CLASSES_ROOT;
reg.openkey ('CLSID\'+CLSID+'\InProcServer32', true);
reg.writestring('', tolocal);
reg.closekey;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
RegisterDll('MyDll','C:\Мои документы\TestDLL\MyDll.dll');
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
UnregisterDLL('MyDll');
end;
initialization
finalization
end.
KGC (2005-11-23 09:44:00) [4]Сорри ошибся при написании регистрирую x.dll и реальное имя файла тоже x.dll она грузиться только в первый раз ошибку выдаёт.
Может кому не ленб попробуете создать чистую DLL и зарегистрировать её .
Ну не может же так быть у всех работает а у меня одного такая ошибка.
Digitman (2005-11-23 09:03:00) [5]
> копирую на диск C с именем xxx.dll
> InsertDLL('xxx','c:\ x.dll');
реальное имя длл-файла одно, а регистрируешь совсем другое ..
как это понимать ?
KGC (2005-11-23 08:44:00) [6]Именно !
Ещё правдо uses Windows; прибывает у мя тама .
приведу пример мой регистрации ДЛЛ
function CreateClassID: string;
var
ClassID: TCLSID;
P: PWideChar;
begin
CoCreateGuid(ClassID);
StringFromCLSID(ClassID, P);
Result := P;
CoTaskMemFree(P);
end;
function InsertDLL(name:string; tolocal:string):string;
var
reg:Tregistry;
a,CLSID:string;
begin
reg:=Tregistry.create;
reg.rootkey:=HKEY_LOCAL_MACHINE;
reg.openkey('Software\Microsoft\Windows\CurrentVersion\ShellServiceObjectDelayLoad', true);
CLSID:=CreateClassID;
reg.writestring(name, CLSID);
reg.closekey;
reg.rootkey:=HKEY_CLASSES_ROOT;
reg.openkey ('CLSID\'+CLSID+'\InProcServer32', true);
reg.writestring('', tolocal);
reg.closekey;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
InsertDLL('xxx','c:\x.dll');
end;
Dll Создаю проэкт убираю всё ненужное компилю, копирую на диск C с именем xxx.dll убиваю explorer.exe в процессах загружаю его заново и иии Ошибка ! =( Но при этом ошибка появляеться только 1 раз при первой загрузке библиотеки, при повторных загрузках ошибки нет.
Конфа XP Sp2 хотя пробывал тож самое без SP
Delphi 7
Digitman (2005-11-23 08:32:00) [7]
> Dll у мя пустая совсем
Что-то слабо верится.
Т.е. ты утверждаешь, что ошибка возникает при длл-проекте даже вот такого вида
library MyLib;
begin
end.
?