求Borland C++2007创建的COM工程文件
使用Borland C++2007集成环境创建COM,运行inside com的例子程序:
/*Registry.h*/
- C/C++ code
#ifndef __Registry_H__#define __Registry_H__HRESULT RegisterServer(HMODULE hModule, const CLSID& clsid, const char* szFriendlyName, const char* szVerIndProgID, const char* szProgID) ;HRESULT UnregisterServer(const CLSID& clsid, const char* szVerIndProgID, const char* szProgID) ;#endif
/*Iface.h*/
- C/C++ code
interface IX : IUnknown{ virtual void pascal Fx() = 0 ;};interface IY : IUnknown{ virtual void pascal Fy() = 0 ;};interface IZ : IUnknown{ virtual void pascal Fz() = 0 ;};extern "C" const IID IID_IX ;extern "C" const IID IID_IY ;extern "C" const IID IID_IZ ;extern "C" const CLSID CLSID_Component1 ;/*GUIDs.cpp*/
- C/C++ code
#include <objbase.h>extern "C" const IID IID_IX = {0x32bb8320, 0xb41b, 0x11cf, {0xa6, 0xbb, 0x0, 0x80, 0xc7, 0xb2, 0xd6, 0x82}} ;extern "C" const IID IID_IY = {0x32bb8321, 0xb41b, 0x11cf, {0xa6, 0xbb, 0x0, 0x80, 0xc7, 0xb2, 0xd6, 0x82}} ;extern "C" const IID IID_IZ = {0x32bb8322, 0xb41b, 0x11cf, {0xa6, 0xbb, 0x0, 0x80, 0xc7, 0xb2, 0xd6, 0x82}} ;extern "C" const CLSID CLSID_Component1 = {0x0c092c21, 0x882c, 0x11cf, {0xa6, 0xbb, 0x0, 0x80, 0xc7, 0xb2, 0xd6, 0x82}} ;/*CMPNT.DEF*/
- C/C++ code
LIBRARY Cmpnt.dll
DESCRIPTION 'Chapter 7 Example COM Component (c)1996-1997 Dale E. Rogerson'
EXPORTS
DllGetClassObject @2PRIVATE
DllCanUnloadNow @3PRIVATE
DllRegisterServer @4PRIVATE
DllUnregisterServer @5PRIVATE
/*Registry.cpp*/
- C/C++ code
#include <objbase.h>
#include <assert.h>
#include "Registry.h"
BOOL setKeyAndValue(const char* pszPath,
const char* szSubkey,
const char* szValue) ;
LONG recursiveDeleteKey(HKEY hKeyParent, const char* szKeyChild) ;
const int CLSID_STRING_SIZE = 39 ;
HRESULT RegisterServer(HMODULE hModule, // DLL module handle
const CLSID& clsid, // Class ID
const char* szFriendlyName, // Friendly Name
const char* szVerIndProgID, // Programmatic
const char* szProgID) // IDs
{
// Get server location.
char szModule[512] ;
DWORD dwResult =::GetModuleFileName(hModule,szModule,sizeof(szModule)/sizeof(char)) ;
...
return S_OK ;
}
...
- C/C++ code
/*Cmpnt.cpp*/#include <iostream.h>#include <objbase.h>#include "Iface.h" // Interface declarations#include "Registry.h" // Registry helper functionsvoid trace(const char* msg) { cout << msg << endl ;}static HMODULE g_hModule = NULL ; // DLL module handle...const char g_szProgID[] = "InsideCOM.Chap07.1" ;class CA : public IX, public IY {public: virtual HRESULT __stdcall QueryInterface(const IID& iid, void** ppv) ; virtual ULONG __stdcall AddRef() ; virtual ULONG __stdcall Release() ; virtual void __stdcall Fx() { cout << "Fx" << endl ;} virtual void __stdcall Fy() { cout << "Fy" << endl ;} CA() ; ~CA() ;private: // Reference count long m_cRef ;} ;CA::CA() : m_cRef(1){ InterlockedIncrement(&g_cComponents) ; }CA::~CA() { InterlockedDecrement(&g_cComponents) ; trace("Component:\t\tDestroy self.") ;}HRESULT __stdcall CA::QueryInterface(const IID& iid, void** ppv){ if (iid == IID_IUnknown) { *ppv = static_cast<IX*>(this) ; } else if (iid == IID_IX) { *ppv = static_cast<IX*>(this) ; trace("Component:\t\tReturn pointer to IX.") ; } ... reinterpret_cast<IUnknown*>(*ppv)->AddRef() ; return S_OK ;}ULONG __stdcall CA::AddRef(){ return InterlockedIncrement(&m_cRef) ;}...
/*Client.cpp - client implementation*/
- C/C++ code
#include <iostream.h>#include <objbase.h>#include "Iface.h"void trace(const char* msg) { cout << "Client: \t\t" << msg << endl ;}int main(){ CoInitialize(NULL) ; trace("Call CoCreateInstance to create") ; trace(" component and get interface IX.") ; IX* pIX = NULL ; HRESULT hr = ::CoCreateInstance(CLSID_Component1,NULL,CLSCTX_INPROC_SERVER,IID_IX,(void**)&pIX) ; if (SUCCEEDED(hr)) { trace("Succeeded getting IX.") ; pIX->Fx() ; // Use interface IX. trace("Ask for interface IY.") ; IY* pIY = NULL ; hr = pIX->QueryInterface(IID_IY, (void**)&pIY) ; if (SUCCEEDED(hr)) { trace("Succeeded getting IY.") ; pIY->Fy() ; // Use interface IY. pIY->Release() ; trace("Release IY interface.") ; } else { trace("Could not get interface IY.") ; } trace("Release IX interface.") ; pIX->Release() ; } else { cout << "Client: \t\tCould not create component. hr = " << hex << hr << endl ; } CoUninitialize() ; return 0 ;}我创建的步骤为:
File->New->Others->ActiveX->ActiveX Library,然后就出现了几个文件,Project1,Project_ALT.cpp,Project1_TLB.cpp,Project1.tlb,晕呀!如何使用C++Builder2007集成环境创建上面的CLIENT.CPP、CMPNT.CPP、GUIDS.CPP、REGISTRY.CPP、IFACE.H、REGISTRY.H、CMPNT.DEF,具体步骤是什么(New->哪些文件)?如何配置(Run->Parameters-具体如何配置?)才能运行Client.cpp? 最好能提供一个使用Borland C++2007创建好的COM工程文件,谢谢!
[解决办法]