Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.229 c
6-1125481501
Nikolay Kislov
2005-08-31 13:45
2005.12.11
Как обойти конфликт между IP адресами?


1-1131611361
JurMan
2005-11-10 11:29
2005.12.11
Как обратиться к СОМ-порту?


14-1132221764
Crazy_Diman
2005-11-17 13:02
2005.12.11
Графика


2-1132918235
Quadro
2005-11-25 14:30
2005.12.11
Странная ошибка


2-1133104703
alishev
2005-11-27 18:18
2005.12.11
Заголовок окна