Конференция "Corba" » Ошибка при подключении interface в Com объекте [Delphi, Windows]
 
  • systopler (17.08.07 05:32) [0]
    Всем привет!!!
    Я жил, не тужил, народу помогал  , короче был хорошим и послушным, но тут случилось бяка…
    А бяка заключалась в том, что мне дали Dll-ку с которой мне нуна активно поработать

    Я не долго думая сделал «Import Component», в результате получил файл *_TLB.pas, который подключил к своему проекту.

    const
     LIBID_deObjDBLib: TGUID = '{741B2D1D-A526-459B-8039-A9D5B4C42391}';

     IID_IObjDB: TGUID = '{9B1611B2-F442-47B3-BE6E-463C82F28F6F}';
     CLASS_ObjDB: TGUID = '{98F6535A-79B2-409B-9068-07BB7E2EC61D}';
    ....

    IObjDB = interface(IUnknown)
    ['{9B1611B2-F442-47B3-BE6E-463C82F28F6F}']
    ….
    CoObjDB = class
    class function Create: IObjDB;
    class function CreateRemote(const MachineName: string): IObjDB;
    end;


    Бросил на форму кнопарь и прописал следующий код:
    procedure TForm1.Button1Click(Sender: TObject);
    var
    v : IObjDB;
    a : CoObjDB;
    begin
    v := a.Create;
    end;

    Думал, что вот оно – счастье, а нет, оказалась «Ж»…

    при выполнении этого кода вылетает ошибка…
    что тока не делал... даже мышку почистил, но не помогло...
    Какой необходимо исполнить танец с бубном, чтобы заработало?
  • Slym © (17.08.07 10:15) [1]
    regsvr32 DllName.dll
  • systopler (17.08.07 11:00) [2]
    Не помогает.

    VBA и C# нормально работают с этой Dll-кой, а вот Delphi не хочет :(
  • umbra © (17.08.07 11:12) [3]

    > Думал, что вот оно – счастье, а нет, оказалась «Ж»…

    какая именно «Ж»? Дословно, если можно
  • systopler (17.08.07 11:36) [4]
    Ж - попа, тока на букву Ж
  • Lacmus © (17.08.07 12:12) [5]
    >systopler

    C Ж всем понятно, а вот какой текст ошибки ?
  • Slym © (17.08.07 12:24) [6]
    procedure TForm1.Button1Click(Sender: TObject);
    var
    v : IObjDB;
    a : CoObjDB;
    begin
    a := CoObjDB.Create;
    v:= a as IObjDB;
    end;
  • systopler (17.08.07 12:24) [7]
    Ошибка:
    OLE error C000001D, ClassID:{98F6535A-79B2-409B-9068-07BB7E2EC61D}
  • systopler (17.08.07 12:26) [8]

    > procedure TForm1.Button1Click(Sender: TObject);
    > var
    > v :;
    > a : CoObjDB;
    > begin
    > a := CoObjDB.Create;
    > v:= a as IObjDB;
    > end;



    так нельзя т.к. "a : CoObjDB" , а CoObjDB.Create возвращает IObjDB
  • systopler (17.08.07 12:26) [9]

    > procedure TForm1.Button1Click(Sender: TObject);
    > var
    > v :;
    > a : CoObjDB;
    > begin
    > a := CoObjDB.Create;
    > v:= a as IObjDB;
    > end;



    так нельзя т.к. "a : CoObjDB" , а CoObjDB.Create возвращает IObjDB
  • Lacmus © (17.08.07 13:02) [10]
    >systopler

    LoadLibrary пробовали ?
  • systopler (17.08.07 13:34) [11]
    procedure TForm1.Button1Click(Sender: TObject);
    var
      СreateObject : procedure (IID:TGUID; out Obj);
      _Mod         : Integer;  //хэндл модуля

      mainObjDB    : ObjDB;
    begin
      _Mod := LoadLibrary(PChar('C:\Dgpp\bin\deObjDB.dll'));
      try
         СreateObject := GetProcAddress (_Mod, 'CreateObject');

         СreateObject (IObjDB, mainObjDB);
      finally
         FreeLibrary (_Mod);
      end;
    end;



    в коде
    СreateObject (IObjDB, mainObjDB);


    выдает сообщение об ошибке
    Access violation at address 00000000. Read of address 00000000
  • systopler (17.08.07 13:39) [12]
    procedure TForm1.Button1Click(Sender: TObject);
    var
      СreateObject : procedure (IID:TGUID; out Obj);
      _Mod         : Integer;  //хэндл модуля

      mainObjDB    : IObjDB;
    begin
      _Mod := LoadLibrary(PChar('C:\Dgpp\bin\deObjDB.dll'));
      try
         СreateObject := GetProcAddress (_Mod, 'CreateObject');
         if @СreateObject = nil then begin
            MessageBox (0, 'СreateObject = nil', '', MB_OK);
            exit;
         end;

         СreateObject (IObjDB, mainObjDB);
      finally
         FreeLibrary (_Mod);
      end;
    end;



    Выходит сообшение, что СreateObject = nil
  • Lacmus © (17.08.07 13:43) [13]
    >systopler   (17.08.07 13:39) [12]

    А _Mod ?

    Перейти в каталог deObjDB.dll ? (SetCurrentDirectory)
  • systopler (17.08.07 13:57) [14]
    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=0
    чтобы я не делал *.dll-ка не хочет открываться :(
  • Lacmus © (17.08.07 14:03) [15]
    Проверить ее depends.exe (если есть).

    Попробовать CoLoadLibrary ?
  • systopler (17.08.07 14:14) [16]
    можно подробней об этой функции, и совсем круто будет если будет примерчик
  • systopler (17.08.07 14:18) [17]
    deObjDB.dll – использует OLE для работы с XML.
    Есть вероятность, что вся проблема в этом?
  • Lacmus © (17.08.07 14:28) [18]
    >можно подробней об этой функции

    http://msdn2.microsoft.com/en-us/library/ms692578.aspx

    >deObjDB.dll – использует OLE для работы с XML.
    >Есть вероятность, что вся проблема в этом?

    GetLastError после LoadLibrary что возвращает ?
  • systopler (17.08.07 14:44) [19]
    в результате этого кода
      _Mod := LoadLibrary ('C:\deObjDB.dll');
      str :=  IntToStr(GetLastError);



    str = '3221225501'
 
Конференция "Corba" » Ошибка при подключении interface в Com объекте [Delphi, Windows]
Есть новые Нет новых   [134431   +9][b:0][p:0.002]