Текущий архив: 2005.12.11;
Скачать: CL | DM;
ВнизВ чём фишка ? Найти похожие ветки
← →
KGC © (2005-11-23 07:59) [0]Здравствуйте уважаемые.
Подскажите в чём же фишка, перечитал не одну статью по загрузке DLL
из ключика реестра Software\Microsoft\Windows\CurrentVersion\ShellServiceObjectDelayLoad
всё бы хорошо да не очень, при загрузке dll выдаёться ошибка
System error. code: 1400.
Недопустимый дескриптор окна.
Dll у мя пустая совсем, пробывал делать и не пустую dll та же фигня.
Нашёл небольшой выход когда мы подключаем Forms и создаём окно то всё окей, ошибка исчезает. Но Forms таскать за собой совершенно не хочеться. Что тут можно предпринять ? Заранее спасибо.
← →
Digitman © (2005-11-23 08:32) [1]
> Dll у мя пустая совсем
Что-то слабо верится.
Т.е. ты утверждаешь, что ошибка возникает при длл-проекте даже вот такого вида
library MyLib;
begin
end.
?
← →
KGC © (2005-11-23 08:44) [2]Именно !
Ещё правдо 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 09:03) [3]
> копирую на диск C с именем xxx.dll
> InsertDLL("xxx","c:\x.dll");
реальное имя длл-файла одно, а регистрируешь совсем другое ..
как это понимать ?
← →
KGC © (2005-11-23 09:44) [4]Сорри ошибся при написании регистрирую x.dll и реальное имя файла тоже x.dll она грузиться только в первый раз ошибку выдаёт.
Может кому не ленб попробуете создать чистую DLL и зарегистрировать её .
Ну не может же так быть у всех работает а у меня одного такая ошибка.
← →
Digitman © (2005-11-23 12:27) [5]не знаю.
у меня все расчудесно работает (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 21:16) [6]Хм знаете как ни странно затестил на другом компьютере 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.
← →
Джо © (2005-11-23 22:05) [7]Задает "главную функцию" библиотеки. Если точка входа в эту функцию определена, она вызывается системой при загрузке и выгрузке библиотеки. Т.е, когда библиотека загружается и выгружается функциями LoadLibrary & FreeLibrary. Параметр dwReason, кроме перечисленных Дигитмэном в cas"е может принимать такие значения: DLL_THREAD_ATTACH, DLL_THREAD_DETACH.
За подробностями обращайтесь к Справочной системе Делфи (глоб. переменная DLLProc) и MSDN (callback-функция DllMain).
Страницы: 1 вся ветка
Текущий архив: 2005.12.11;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.036 c