Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.16;
Скачать: CL | DM;

Вниз

Ошибка при открытии DLL-ки   Найти похожие ветки 

 
systopler   (2007-08-18 10:32) [0]

Не могу открыть Dll-ку (c Com-объектами)
В чем может быть проблема?

procedure TForm1.Button1Click(Sender: TObject);
var
 СreateObject : procedure (IID:TGUID; out Obj);
 _Mod         : Integer;  //хэндл модуля

 mainObjDB    : IObjDB;
begin
 SetCurrentDirectory ("C:\");
 _Mod := LoadLibrary ("C:\deObjDB.dll");
 if _Mod = 0 then begin
    MessageBox (0, "Библиотека не загрузилась :(", "", MB_OK);
    exit;
 end;
 try
    СreateObject := GetProcAddress (_Mod, "CreateObject");
    if not Assigned(@СreateObject) then MessageBox (0, "СreateObject = nil", "", MB_OK)
    else                                СreateObject (IObjDB, mainObjDB);
 finally
    FreeLibrary (_Mod);
 end;
end;


в результате этого кода
 _Mod := LoadLibrary ("C:\deObjDB.dll");
 str :=  IntToStr(GetLastError);


str = "3221225501"


 
DrPass ©   (2007-08-18 10:38) [1]

Хм... а что, СОМ-объекты создаются таким способом? 8-)


 
systopler   (2007-08-18 10:46) [2]

Один из вариантов :)


 
wl ©   (2007-08-18 12:05) [3]

ужос... вот что значит делать через попу


 
systopler   (2007-08-18 12:41) [4]

Этот код противоречит правилам работы с библиотекой?
Да, это не самый красивый вариант, но по некоторым причинам приходится  делать именно так.
И вопрос состоит не в том, почему так, а почему не работает.


 
Dimka Maslov ©   (2007-08-18 12:53) [5]

Да, так делать можно, но 1. Вызов CoInitialize не отменял. 2. Коды ошибок возвращаемые GetLastError можно либо прочитать в MSDN либо str := SysErrorMessage(GetLastError) там тоже будет написано.


 
wl ©   (2007-08-18 12:58) [6]

Dimka Maslov, imho, делфи сама вызывает coinit? точнее сама пихает её вызов при запуске программы


 
Dimka Maslov ©   (2007-08-18 13:07) [7]


> wl ©   (18.08.07 12:58) [6]

Зачем отжирать ресурсы, которые могут и не понадобиться? По крайней мере 7 этого не делает


 
systopler   (2007-08-18 13:26) [8]

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ActiveX;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

uses deObjDBLib_TLB, ComObj;
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  СreateObject : procedure (IID:TGUID; out Obj);
  _Mod         : Integer;  //хэндл модуля

  mainObjDB    : IObjDB;
  str          : string;
begin
  SetCurrentDirectory ("C:\");
  _Mod := LoadLibrary ("C:\deObjDB.dll");
  str :=  IntToStr(GetLastError);
  if _Mod = 0 then begin
     MessageBox (0, "Библиотека не загрузилась :(", "", MB_OK);
     exit;
  end;
  try
     СreateObject := GetProcAddress (_Mod, "CreateObject");
     if not Assigned(@СreateObject) then MessageBox (0, "СreateObject = nil", "", MB_OK)
     else                                СreateObject (IObjDB, mainObjDB);
  finally
     FreeLibrary (_Mod);
  end;
end;

initialization
 CoInitialize(nil);
 
finalization
 CoUninitialize;

end.


 
wl ©   (2007-08-18 16:23) [9]

дима, семерка вроде делает вызов?
даж не представляю какой можно простейший тест сделать для проверки...
ActiveControl?


 
umbra ©   (2007-08-18 17:30) [10]

да уж. а что, библиотека, содержащая СОМ-сервер экспортирует функцию CreateObject? Что-то я сильно в этом сомневаюсь.


 
DrPass ©   (2007-08-18 17:31) [11]


>  библиотека, содержащая СОМ-сервер экспортирует функцию
> CreateObject

Вообще, пока что автор так и не сказал, где там у него ошибка. LoadLibrary возвращает 0, GetProcAddress или еще что?


 
systopler   (2007-08-18 17:42) [12]

LoadLibrary возвращает 0
при этом
str :=  IntToStr(GetLastError);
str = 3221225501 (С00000D)


 
umbra ©   (2007-08-18 17:44) [13]


> Вообще, пока что автор так и не сказал, где там у него ошибка.

не сказал. Вообще-то это римейк ветки http://delphimaster.net/view/10-1187314368/


 
umbra ©   (2007-08-18 17:46) [14]

2 systopler

что Вам мешает просто создать объект с помощью делфовской CreateOLEObject, например? Зачем получать адрес несуществующей функции?


 
DrPass ©   (2007-08-18 18:09) [15]


> systopler   (18.08.07 17:42) [12]
> LoadLibrary возвращает 0


> str = 3221225501 (С00000D)

Не знаю, что за код, но спроси это у FormatMessage


 
isasa ©   (2007-08-18 23:23) [16]

DrPass ©   (18.08.07 18:09) [15]
У COM "своя" интерпретация ошибок(кодов сообщения). Книгу в субботу лень искать.


 
sniknik ©   (2007-08-18 23:45) [17]

> И вопрос состоит не в том, почему так, а почему не работает.
это как раз не вопрос... нет ее там, в экспорте, функции CreateObject, и все
вот проверь эти, эти должны быть  
DllGetClassObject, DllCanUnloadNow, DllRegisterServer, DllUnregisterServer


 
DrPass ©   (2007-08-19 00:04) [18]


> это как раз не вопрос... нет ее там, в экспорте, функции
> CreateObject

У него до этого даже и не доходит - падает еще на LoadLibrary


 
sniknik ©   (2007-08-19 00:12) [19]

> падает еще на LoadLibrary
а... ну тогда нет/не находит dll, неправильный путь/название, либо файл на самом деле не dll(/osx/exe) а фигня какаято.


 
sniknik ©   (2007-08-19 01:05) [20]

кстати чего нашол...
WBEM_MC_WBEM_SERVICE_INIT_FAILURE 3221225501 0xC000001D
Error number %1 was returned in trying to initialize Windows Management Instrumentation Service. This could be due to a badly installed version of WMI, WMI repository upgrade failure, insufficient disk space or insufficient memory.

при LoadLibrary должна же инициализационная часть dll-и выполнятся? вот если там есть инициализация WMI, а он не чегото там не находит и отказывается инициализироваться... ошибка подходит.
т.е. получается чегото у него там недо-установлено на компе где дельфи, а работающие VBA и C# работают на другом компе...

как вариант.
> В чем может быть проблема?


 
isasa ©   (2007-08-19 11:39) [21]

В инициализационной чпсти выполняется загрузка "OLEAUT32.DLL".
Ее может не быть ... Раз автор так тупо пытается обойти стандартный механизм.
А вообще то, все функции

...
exports
 DllGetClassObject,
 DllCanUnloadNow,
 DllRegisterServer,
 DllUnregisterServer;
...

возвращают
HRESULT

Старший бит HRESULT, как показано на рис. 6-1, отмечает, успешно или нет выполнена функция. Это позволяет определить много кодов возврата и для успеха, и для неудачи. Последние 16 битов содержат собственно код
возврата. Остальные 15 битов содержат дополнительную информацию о типе и источнике ошибки.


 
systopler   (2007-08-19 12:32) [22]

Все эксперименты по «оживлению» библиотеки «deObjDB.dll» происходят на одном компьютере, на котором установлено Delphi и VBA.  VBA отлично работает с этой библиотекой, а вот Delphi не хочет. Получается, что VBA уделало Delphi…  Даже жутко об этом думать.
deObjDB.dll активно использует библиотеку «msxml3.dll», возможно и другие библиотеки, но все они, как и сама библиотека зарегистрированы с помощью regsvr32.exe

стандартный способ работы с этой библиотекой тоже не дал положительных результатов.
http://delphimaster.net/view/10-1187314368/


 
sniknik ©   (2007-08-19 16:55) [23]

ты бы выложил эту "страшную" dll куда нибудь... посмотреть. а то на слово оно както...


 
systopler   (2007-08-19 17:01) [24]

Выложить не могу, т.к. за нее фирма выложила денги и мне запрещено ее распространение, да и к разработчикам я тоже не могу обратиться :(


 
sniknik ©   (2007-08-19 17:14) [25]

и как это она распространиться если она не работает? :о))) нафиг она кому нужна такая?.


 
systopler   (2007-08-19 18:26) [26]

Я же говорю, что в VBA он работает на УРА.
Программа на которой работает компания написана на VBA, а эту библиотеку ей написали под заказ. Мне нужно написать пару Com объектов, которые будут использовать объекты из этой библиотеки.


 
isasa ©   (2007-08-19 20:58) [27]

Чудес не бывает. Можно "потрясти" компонент разными способами
1.
var
   intf: IObjDB;
...
begin
 intf:= CreateComObject(CLASS_ObjDB) as IObjDB;  // CLASS_ObjDB - GUID коКласса.

2.
var
 intf: IObjDB;
...
 intf:=CoObjDB.Create as IObjDB;

3.
var intf : Variant;
...
begin
 intf:=CreateOleObject("<имя COM объекта>");

последний вариант - исключительно позднее связывание и не требует TLB, т.е. абсолютно в стиле "а ля VBA"/


 
systopler   (2007-08-20 05:36) [28]

Попробовал всеми 3-я вариантами, но ошибка была одна и та же и на том же месте.
Все меня не покидает ощущение, что библиотеке что-то нужно, но вот вопрос  что именно и как с тим разобраться?????


 
sniknik ©   (2007-08-20 08:59) [29]

ага, VBA  ей нужен...
отдай на "разбор" тому кто умеет разбираться... и лучше всего имеет ее исходники.

про VBA это кстати серьезно (как и по второму впрочем...)
давно уже, писал dll-и под 1С 7.7, так вот они "родные" мало того что имели извратную структуру (все по требованиям 1С-а, без этого 1С их не инициализировал и русских методов не было, а это требовалось), так еще и главное(!) имели обратную связь (это уже не по требованиям, но для чегото нужно было, вроде события делал), т.е. при инициализации получался адрес процесса исполняющего dll и по этому адресу выполнялись команды самого 1С (типа скрипт написанный на 1С можно было выполнить вызвав метод 1С Execute).
ну так вот, естественно при столь жесткой завязке эти dll-и работали только в 1С, и ни VBA ни Delphi ... ets. не "катило", вздумай кто ее вызвать оттуда.

тут вроде такого нет (т.к. говорит и на C# работает), поэтому можно надеятся на 2 пункт... есть вероятность удачного "разбора".


 
isasa ©   (2007-08-20 10:52) [30]

Я понял, что мне не нравится в TLB - файле.

IObjDB = interface(IUnknown)
["{9B1611B2-F442-47B3-BE6E-463C82F28F6F}"]

а надо бы для счастья IDispatch, т.к.

The IDispatch interface was initially designed to support Automation. It provides a late-binding mechanism to access and retrieve information about an object"s methods and properties.


 
systopler   (2007-08-20 12:44) [31]

замена ничего не дала...
может быть это заговор МелкоМягких?


 
systopler   (2007-08-20 12:47) [32]

Возможно, что при инициализации библиотеки нужно что-то подкрутить, доделать лобзиком

наприер:
initialization
CoInitialize(<Переменная или объект>);


???


 
sniknik ©   (2007-08-20 14:51) [33]

> замена ничего не дала...
а ты, что вот так просто взял и поменял? в описателе, и ожидаешь, добавления соответствующих методов диспатча, изменения скомпилированной dll (а заодно и исходников у автора... ;) нехай он там помучается. :))))
или все таки ты автор и у тебя есть исходники этой "страшно/й/дорогой" dll-и?

> Возможно, что при инициализации библиотеки нужно что-то подкрутить, доделать лобзиком
вообще с IUnknown тоже можно писать, не используя мастер, может еще с какими ограничениями... (те dll-и для 1С тоже так писались, пример -> IInitDone = interface(IUnknown), ILanguageExtender = interface(IUnknown), ,,,  и ничего работало (вызов в дельфи валился от другого, и после, а CreateOleObject проходило...))

т.что прежде чем браться за лобзик надо бы сначала определить где пилить...


 
sniknik ©   (2007-08-20 15:01) [34]

кстати, сдесь  
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1317
пример с IUnknown


 
sniknik ©   (2007-08-20 15:01) [35]

в смысле внизу "Примеры к уроку"


 
имя   (2007-08-20 22:33) [36]

Удалено модератором



Страницы: 1 вся ветка

Текущий архив: 2007.09.16;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.026 c
15-1187259332
Piter
2007-08-16 14:15
2007.09.16
Полетела Windows 2003 Server Datacenter Edition (eng)


9-1157787679
Viv
2006-09-09 11:41
2007.09.16
Ищу программку переводящую фонт в бмпшку...


15-1187705040
oldman
2007-08-21 18:04
2007.09.16
Хочу съездить в Финляндию...


6-1169218004
Vlad Oshin
2007-01-19 17:46
2007.09.16
Как отправить письмо самому себе клиентом по умолчанию?


11-1171022650
WiseImp
2007-02-09 15:04
2007.09.16
Turbo Delphi?