首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

求Borland C++2007创建的COM工程文件解决思路

2012-02-15 
求Borland C++2007创建的COM工程文件使用Borland C++2007集成环境创建COM,运行inside com的例子程序:/*Reg

求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工程文件,谢谢!


[解决办法]
探讨
还是无法运行:1、我的工程名是ProjectDLL,在Debug目录中没有生成CMPNT.DLL,只有ProjectDLL.dll文件,而这个ProjectDLL.dll只有22.5KB,使用regsvr32 -s ProjectDLL.dll也不好用。为什么没有生成Cmpnt.dll文件呢?
2、Client.cpp文件也在这个工程文件中,在DEBUG目录中只找到Client.obj文件,为什么没有Client.exe?

热点排行