一个COM示例程序

简介:
void CEx24cView::OnTestSpaceship() 
{
    CLSID clsid;
    LPCLASSFACTORY pClf; 
    LPUNKNOWN pUnk;
    IMotion* pMot;
    IVisual* pVis;
    HRESULT hr;

    if ((hr = ::CLSIDFromProgID(L"Spaceship", &clsid)) != NOERROR) 
    {
        TRACE("unable to find Program ID -- error = %x\n", hr);
        return;
    }
    if ((hr = ::CoGetClassObject(clsid, CLSCTX_INPROC_SERVER,
        NULL, IID_IClassFactory, (void **) &pClf)) != NOERROR) {;
        TRACE("unable to find CLSID -- error = %x\n", hr);
        return;
    }

    pClf->CreateInstance(NULL, IID_IUnknown, (void**) &pUnk);
    pUnk->QueryInterface(IID_IMotion, (void**) &pMot); // All three
    pMot->QueryInterface(IID_IVisual, (void**) &pVis); //  pointers
                                                       //  should work
    TRACE("main: pUnk = %p, pMot = %p, pDis = %p\n", pUnk, pMot, pVis);
    
    // Test all the interface virtual functions
    pMot->Fly();
    int nPos = pMot->GetPosition();
    TRACE("nPos = %d\n", nPos);
    pVis->Display();

    pClf->Release();
    pUnk->Release();
    pMot->Release();
    pVis->Release();
    AfxMessageBox("Test succeeded. See Debug window for output.");
}
// interface.h

struct IMotion : public IUnknown
{
    STDMETHOD_(void, Fly) () = 0;
    STDMETHOD_(int&, GetPosition) () = 0;
};

struct IVisual : public IUnknown
{
    STDMETHOD_(void, Display) () = 0;
};
// Spaceship.h : header file

Code
// Spaceship.cpp : implementation file

Code
正规DLL部分代码


/////////////////////////////////////////////////////////////////////////////
// CEx24bApp initialization

BOOL CEx24bApp::InitInstance()
{
    // Register all OLE server (factories) as running.  This enables the
    //  OLE libraries to create objects from other applications.
    COleObjectFactory::RegisterAll();

    return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// Special entry points required for inproc servers

STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    return AfxDllGetClassObject(rclsid, riid, ppv);
}

STDAPI DllCanUnloadNow(void)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    return AfxDllCanUnloadNow();
}

// by exporting DllRegisterServer, you can use regsvr.exe
STDAPI DllRegisterServer(void)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    COleObjectFactory::UpdateRegistryAll();
    return S_OK;
}

要想运行客户端和组件程序,必须先注册组件来更新注册表,可以使用如下的代码:

BOOL CRegCompApp::InitInstance()
{
    SetRegistryKey(_T("Local AppWizard-Generated Applications"));
    // make sure to set Explorer options to allow DLLs to be visible
    CSpecialFileDialog dlgFile(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
        "OCX files (*.ocx)|*.ocx|DLL files (*.dll)|*.dll||");
    dlgFile.m_ofn.lpstrTitle = "注册OCX/DLL File";
    if(dlgFile.DoModal() != IDOK)  return FALSE;
    CString strDllPath = dlgFile.GetPathName();//获取文件名
    // this wouldn't work for a dynamically linked Regular DLL
    HINSTANCE h = ::LoadLibrary(strDllPath);//加载dll
    if(h == NULL)
    {
        CString msg;
        msg.Format("Failed to find server %s", strDllPath);
        AfxMessageBox(msg);
        return FALSE;
    }
    FARPROC pFunc = ::GetProcAddress((HMODULE) h, "DllRegisterServer");
    if(pFunc == NULL) {
        AfxMessageBox("Failed to find DllRegisterServer function");
        return FALSE;
    }
    (*pFunc)();    // call the function to register the server 注册
    AfxMessageBox("Server registered OK");
    return FALSE;
}


本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2007/11/17/962867.html,如需转载请自行联系原作者
目录
相关文章
|
6月前
|
IDE 编译器 Shell
运行C程序的步骤与方法
C语言是一种通用、过程式的计算机编程语言,广泛应用于系统软件与应用软件的开发中。本文将详细介绍如何编写、编译和运行一个简单的C程序,并附上相应的代码示例。
145 0
|
C++
VS下源文件中有多个代码时如何指定运行特定的代码(一个源文件下有多个代码时运行指定代码)
VS下源文件中有多个代码时如何指定运行特定的代码(一个源文件下有多个代码时运行指定代码)
285 0
|
缓存 Ubuntu Linux
安装HElib并运行示例程序
安装HElib并运行示例程序
安装HElib并运行示例程序
|
存储 分布式计算 Ubuntu
示例程序WordCount的执行
示例程序WordCount的执行
|
存储
Qt 5——添加资源文件方法步骤(图解)
Qt 5——添加资源文件方法步骤(图解)
1097 0
Qt 5——添加资源文件方法步骤(图解)
|
Dart
Dart Hello World 示例程序【Dart专题1】
Dart Hello World 示例程序 Dart—你好世界 在本教程中,我们将编写一个非常基本的 Dart 程序。此示例程序打印Hello World到控制台。
126 0
Dart Hello World 示例程序【Dart专题1】
|
开发工具
Excel 宏编程-使用excel宏编写第一个Hello World程序实例演示!
Excel 宏编程-使用excel宏编写第一个Hello World程序实例演示!
483 0
Excel 宏编程-使用excel宏编写第一个Hello World程序实例演示!
|
C++
CxImage的编译及简单使用举例
1、  从http://sourceforge.net/projects/cximage/下载最新的CxImage 702源码; 2、  解压缩后,以管理员身份打开CxImageFull_vc10.sln工程,在编译之前先将每个工程属性的Character Set由原先的Use Unicode C...
1448 0