ATL创建进程外COM组件服务

应用com组件实现32位程序调用64位dll和64位程序调用32dll文件。

以32位调用64位dll为例:

创建64位dll文件

https://www.cnblogs.com/xbit/p/9625743.html

完成后得到*.dll文件,*.lib文件,*.h文件,作为准备文件。

应用ATL创建com组件

点击完成dll的准备文件添加到atl工程中,创建一个ATL简单对象:

添加接口方法:

STDMETHODIMP CCalc::ComSum(LONG a, LONG b, LONG* c)
{
    // TODO: 在此添加实现代码
    //dll_class dll_obj;

    *c = dll_sum(a, b);

    return S_OK;
}

重载函数

HRESULT PreMessageLoop(int nShowCmd)
    {
        // TODO: 在此添加专用代码和/或调用基类
        HRESULT hr = ::CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IDENTIFY, NULL, EOAC_NONE, NULL);
        if (FAILED(hr))
        {
            ATLASSERT(FALSE);
            return hr;
        }
        hr = this->RegisterClassObjects(CLSCTX_LOCAL_SERVER, REGCLS_SINGLEUSE);
        if (hr == S_OK) { if (m_bDelayShutdown && !this->StartMonitor()) { hr = E_FAIL; } }
        else { m_bDelayShutdown = false; }
        ATLASSERT(SUCCEEDED(hr));
        return hr;
    }

    //重载该函数,在执行完常规注册以后将接口软件的自定义属性写入注册表
        bool ParseCommandLine(LPCTSTR lpCmdLine, HRESULT* pnRetCode) throw()
        {
            *pnRetCode = S_OK;
            TCHAR szTokens[] = _T("-/");
            LPCTSTR lpszToken = FindOneOf(lpCmdLine, szTokens);
            while (lpszToken != NULL)
            {
                if (WordCmpI(lpszToken, _T("UnregServer")) == 0)
                {
                    *pnRetCode = this->UnregisterServer(TRUE);
                    *pnRetCode = this->UnregisterAppId();
                    return false;
                }
                // Register as Local Server
                if (WordCmpI(lpszToken, _T("RegServer")) == 0)
                {
                    *pnRetCode = this->RegisterAppId();
                    if (SUCCEEDED(*pnRetCode)) *pnRetCode = this->RegisterServer(TRUE);
                    //向注册表写入自定义属性注册信息并注册实施类别
                    if (SUCCEEDED(*pnRetCode)) {}
                    return false;
                }
                lpszToken = FindOneOf(lpszToken, szTokens);
            }
            return true;
        }

 

修改工程.rgs

    NoRemove AppID
    {
        '%APPID%' = s 'Test64Dll'
        'Test64Dll.EXE'
        {
            val AppID = s '%APPID%'
        }
    }

启动COM组件服务程序:

以管理员身份运行,在DCOM组件服务中查看启动该程序。WIN+R中输入dcomcnfg。

创建32位的应用程序,

将ATL文件中的Test64Dll_i.c,Test64Dll_i.h文件拷贝到项目文件

Test64Dll_i.c文件去掉预编译头选项

进行编译,可以实现32位程序调用64dll。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 ATL 创建窗口可以遵循以下步骤: 1. 在 Visual Studio 中创建一个 ATL 项目。 2. 在 ATL 项目中,打开 `resource.h` 文件并添加新的资源 ID。 3. 在 ATL 项目中,打开 `MyWindow.h` 文件并添加以下代码: ```c++ class CMyWindow : public CWindowImpl<CMyWindow> { public: DECLARE_WND_CLASS(_T("MyWindowClass")) BEGIN_MSG_MAP(CMyWindow) MESSAGE_HANDLER(WM_CREATE, OnCreate) MESSAGE_HANDLER(WM_PAINT, OnPaint) MESSAGE_HANDLER(WM_DESTROY, OnDestroy) END_MSG_MAP() private: LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { return 0; } LRESULT OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { PAINTSTRUCT ps; HDC hdc = BeginPaint(&ps); EndPaint(&ps); return 0; } LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { PostQuitMessage(0); return 0; } }; ``` 4. 在 ATL 项目中,打开 `MyWindow.cpp` 文件并添加以下代码: ```c++ #include "stdafx.h" #include "resource.h" #include "MyWindow.h" CMyWindow::CMyWindow() { } LRESULT CMyWindow::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { // 创建窗口 Create(NULL, CRect(0, 0, 640, 480), _T("My Window"), WS_OVERLAPPEDWINDOW); return 0; } LRESULT CMyWindow::OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { PAINTSTRUCT ps; HDC hdc = BeginPaint(&ps); // 绘制图形 EndPaint(&ps); return 0; } LRESULT CMyWindow::OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { PostQuitMessage(0); return 0; } ``` 5. 在 ATL 项目中,打开 `stdafx.h` 文件并添加以下代码: ```c++ #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS #define _AFX_ALL_WARNINGS #include <afxwin.h> #include <atlbase.h> #include <atlapp.h> extern CAppModule _Module; #include <atlwin.h> ``` 6. 在 ATL 项目中,打开 `main.cpp` 文件并添加以下代码: ```c++ #include "stdafx.h" #include "MyWindow.h" CAppModule _Module; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { _Module.Init(NULL, hInstance); CMyWindow wnd; wnd.Create(NULL); wnd.ShowWindow(nCmdShow); MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } _Module.Term(); return 0; } ``` 以上是使用 ATL 创建窗口的基本步骤,可以根据实际需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值