Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2005.12.11;
Скачать: [xml.tar.bz2];

Вниз

В чём фишка ?   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.033 c
3-1130404294
Ильичев С.А.
2005-10-27 13:11
2005.12.11
CreateParameter


3-1130331984
DmitryA
2005-10-26 17:06
2005.12.11
Как открыть таблицу Visual Foxpro?


2-1132688533
HeavyMaster
2005-11-22 22:42
2005.12.11
UpDown


6-1124963167
ShuRiK_0481
2005-08-25 13:46
2005.12.11
Как получить Location из URL?


1-1130999962
kblc
2005-11-03 09:39
2005.12.11
Есть ли у класса интерфейс?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский