Я создал 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;
}
Может ли кто-нибудь сказать мне, почему это происходит? Любое предложение или исправление для кода будет полезно для меня. заранее спасибо
Я считаю, что вам нужно заменить
IID_ISampleComObj
с
__uuidof(ISampleComObj)
IID_ISampleComObj
. Я не уверен, почему это решение было принято. Возможно, дизайнеры, уже предоставив__uuidof
чувствовали, что нет необходимости делать больше.