Форум: "Прочее";
Текущий архив: 2007.09.16;
Скачать: [xml.tar.bz2];
ВнизОшибка при открытии 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;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.064 c