Невозможно получить определение интерфейса IID_IXXX даже после регистрации DLL

1

Я создал COM DLL/TLB в delphi с интерфейсом ISampleComObj.

Когда я собираюсь использовать один и тот же DLL/TLB в коде C++.

Я не могу получить декларацию IID_ISampleComObj любом месте.

Ниже приведен код в TLB.

    unit SampleActiveXDLLProject_TLB;

{$TYPEDADDRESS OFF} // Unit must be compiled without type-checked pointers. 
interface

uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL;

const
  // TypeLibrary Major and minor versions
  SampleActiveXDLLProjectMajorVersion = 1;
  SampleActiveXDLLProjectMinorVersion = 0;

  LIBID_SampleActiveXDLLProject: TGUID = '{E2F63791-0F6D-4E0F-ACCE-1F8EA022AC53}';

  IID_ISampleComObj: TGUID = '{0CC77278-A859-426D-8115-A4D0D60D945C}';
  CLASS_SampleComObj: TGUID = '{BC8F4021-B431-49D2-AA69-46BA577A323A}';
  IID_ISampleComObject: TGUID = '{E60E417D-C5B5-4290-860A-7D11FE7250D3}';
  CLASS_SampleComObject: TGUID = '{553320FD-1ADC-438B-A283-219D960BB93A}';
type

// *********************************************************************//
// Forward declaration of types defined in TypeLibrary                    
// *********************************************************************//
  ISampleComObj = interface;
  ISampleComObject = interface;
  ISampleComObjectDisp = dispinterface;

// *********************************************************************//
// Declaration of CoClasses defined in Type Library                       
// (NOTE: Here we map each CoClass to its Default Interface)              
// *********************************************************************//
  SampleComObj = ISampleComObj;
  SampleComObject = ISampleComObject;


// *********************************************************************//
// Interface: ISampleComObj
// Flags:     (4352) OleAutomation Dispatchable
// GUID:      {0CC77278-A859-426D-8115-A4D0D60D945C}
// *********************************************************************//
  ISampleComObj = interface(IDispatch)
    ['{0CC77278-A859-426D-8115-A4D0D60D945C}']
    function  CreateAndShowMyData: HResult; stdcall;
  end;

// *********************************************************************//
// Interface: ISampleComObject
// Flags:     (320) Dual OleAutomation
// GUID:      {E60E417D-C5B5-4290-860A-7D11FE7250D3}
// *********************************************************************//
  ISampleComObject = interface(IUnknown)
    ['{E60E417D-C5B5-4290-860A-7D11FE7250D3}']
    procedure CreateAndShowMyData; safecall;
  end;

// *********************************************************************//
// DispIntf:  ISampleComObjectDisp
// Flags:     (320) Dual OleAutomation
// GUID:      {E60E417D-C5B5-4290-860A-7D11FE7250D3}
// *********************************************************************//
  ISampleComObjectDisp = dispinterface
    ['{E60E417D-C5B5-4290-860A-7D11FE7250D3}']
    procedure CreateAndShowMyData; dispid 1;
  end;

// *********************************************************************//
  CoSampleComObj = class
    class function Create: ISampleComObj;
    class function CreateRemote(const MachineName: string): ISampleComObj;
  end;

// *********************************************************************//
  CoSampleComObject = class
    class function Create: ISampleComObject;
    class function CreateRemote(const MachineName: string): ISampleComObject;
  end;

implementation

uses ComObj;

class function CoSampleComObj.Create: ISampleComObj;
begin
  Result := CreateComObject(CLASS_SampleComObj) as ISampleComObj;
end;

class function CoSampleComObj.CreateRemote(const MachineName: string): ISampleComObj;
begin
  Result := CreateRemoteComObject(MachineName, CLASS_SampleComObj) as ISampleComObj;
end;

class function CoSampleComObject.Create: ISampleComObject;
begin
  Result := CreateComObject(CLASS_SampleComObject) as ISampleComObject;
end;

class function CoSampleComObject.CreateRemote(const MachineName: string): ISampleComObject;
begin
  Result := CreateRemoteComObject(MachineName, CLASS_SampleComObject) as ISampleComObject;
end;

Ниже приведен код файла .tlh созданного после импорта TLB в коде C++.

#pragma once
#pragma pack(push, 8)

#include <comdef.h>

namespace SampleActiveXDLLProject {

// Forward references and typedefs

struct __declspec(uuid("e2f63791-0f6d-4e0f-acce-1f8ea022ac53"))
/* LIBID */ __SampleActiveXDLLProject;
struct __declspec(uuid("0cc77278-a859-426d-8115-a4d0d60d945c"))
/* interface */ ISampleComObj;
struct /* coclass */ SampleComObj;
struct __declspec(uuid("e60e417d-c5b5-4290-860a-7d11fe7250d3"))
/* dual interface */ ISampleComObject;
struct /* coclass */ SampleComObject;


// Smart pointer typedef declarations


_COM_SMARTPTR_TYPEDEF(ISampleComObj, __uuidof(ISampleComObj));
_COM_SMARTPTR_TYPEDEF(ISampleComObject, __uuidof(ISampleComObject));

// Type library items

struct __declspec(uuid("0cc77278-a859-426d-8115-a4d0d60d945c"))
ISampleComObj : IUnknown
{

    HRESULT CreateAndShowMyData ( );
    virtual HRESULT __stdcall raw_CreateAndShowMyData ( ) = 0;
};

struct __declspec(uuid("bc8f4021-b431-49d2-aa69-46ba577a323a"))
SampleComObj;
    // [ default ] interface ISampleComObj

struct __declspec(uuid("e60e417d-c5b5-4290-860a-7d11fe7250d3"))
ISampleComObject : IUnknown
{

    HRESULT CreateAndShowMyData ( );
    virtual HRESULT __stdcall raw_CreateAndShowMyData ( ) = 0;
};

struct __declspec(uuid("553320fd-1adc-438b-a283-219d960bb93a"))
SampleComObject;
    // [ default ] interface ISampleComObject


#include "..\debug\sampleactivexdllproject.tli"

} // namespace SampleActiveXDLLProject

#pragma pack(pop);

И код, который я использую для создания экземпляра объекта Class:

int _tmain(int argc, _TCHAR* argv[])
{
    HRESULT hr;
    CoInitialize(NULL);

    wchar_t progid[] = L"SampleActiveXDLLProject.SampleComObj";
    CLSID clsid;
    ::CLSIDFromProgID(progid,&clsid);


    ISampleComObj* pcf  =NULL;

    hr = CoGetClassObject(clsid,CLSCTX_INPROC_SERVER,NULL
        ,IID_ISampleComObj, (void**) &pcf); 

//получение ошибки как необъявленный идентификатор IID_ISampleComObj

    assert(pcf);

    hr = pcf->CreateAndShowMyData();

    CoUninitialize();
    return 0;
}

Может ли кто-нибудь сказать мне, почему это происходит? Любое предложение или исправление для кода будет полезно для меня. заранее спасибо

Теги:
dll

1 ответ

3
Лучший ответ

Я считаю, что вам нужно заменить

IID_ISampleComObj

с

__uuidof(ISampleComObj)
  • 0
    спасибо Это решает проблему. Подскажите, пожалуйста, зачем мне это делать?
  • 1
    Импортер библиотеки типов не объявил идентификатор с именем IID_ISampleComObj . Я не уверен, почему это решение было принято. Возможно, дизайнеры, уже предоставив __uuidof чувствовали, что нет необходимости делать больше.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню