Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
15-1187378684
Kostafey
2007-08-17 23:24
2007.09.16
Про запуск cmd


1-1183640451
Seldoff
2007-07-05 17:00
2007.09.16
CompareStr vs StrComp


15-1187267100
vlad_oshin
2007-08-16 16:25
2007.09.16
форум против компьютера . в шахматы.


11-1170007808
fender
2007-01-28 21:10
2007.09.16
SpriteUtils2 2.08b


15-1187553791
wp2
2007-08-20 00:03
2007.09.16
Как загрузить Rich-тест в компонент TRichEdit на этапе проэктир..





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский