您的位置:首页 > 其它

使用Visual Studio的RPC调试功能同时调试COM程序的客户端和服务端

2009-01-23 15:16 513 查看
假设你现在正在开发一个COM系统,该系统由两个独立程序组成,一个是COM的服务器(COM Server),这是一个独立的exe程序;另外一个是调用这个COM服务器相关服务的COM客户端(COM Client)。这种场景一般是你希望你的COM服务器可以提供一些自动化(Automation)功能,允许你的用户写一些vbs程序来为你的程序提供一些自动化脚本。 例如Office Excel自己本身是一个独立的程序,但是如果你使用vbs脚本创建自动化程序自动处理数据,生成一些脚本的时候,你会发现Excel是以无窗口的形式启动的。
一般这种系统都是比较难调试的,这是因为一个函数调用需要跨过进程界限,由两个进程合作完成的,而通常情况下我们都只是调试一个进程。Visual Studio 2005以后,提供了一个RPC调试(RPC Debugging)功能,可以在你单步跟进一个远程COM方法调用的时候,自动将调试器附加到远程COM方法所在的进程。通过这种处理,在调试远程COM方法调用时,你就感觉是在调试同一个进程里面的方法。
以下面一个COM系统为例:
COM客户端
这是一个简单的命令行程序,启动本地COM服务器,然后调用一个远程方法TestComMethod,然后退出。
// ComCppClient.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <crtdbg.h>
#import "D://Workspace//Forum//DebugTraining//DebugTraining//Debug//DebugTraining.tlb" no_namespace, raw_interfaces_only, named_guids

int _tmain(int argc, _TCHAR* argv[])
{
::CoInitialize(NULL);

ITestClass *pIUnk = NULL;
HRESULT hr = ::CoCreateInstance(CLSID_TestClass, NULL, CLSCTX_LOCAL_SERVER, __uuidof(ITestClass), (void **)&pIUnk);

_ASSERT(hr == 0);

hr = pIUnk->TestComMethod(123);
_ASSERT(hr == 0);

pIUnk->Release();

::CoUninitialize();
return 0;
}

COM服务端
这是一个ATL EXE程序,我添加了一个类CTestClass,和一个函数TestComMethod。
// TestClass.cpp : Implementation of CTestClass

#include "stdafx.h"
#include "TestClass.h"

STDMETHODIMP CTestClass::TestComMethod(DWORD id)
{
MessageBox(NULL, L"This is a Test", L"Test", MB_OK);
return S_OK;
}
调试设置
我们是希望在同一个调试器里面同时调试COM客户端和COM服务端,因此
1. 我们要确保将Visual Studio设置成非托管(Native)程序的即时调试器(JIT Debugger),方法是点击Visual Studio菜单里面的“工具(Tools)”—“选项(Options)”—“调试(Debugging)”—“即时调试(Just-In-Time)”,选中里面的“非托管(Native)程序”复选框,如下图所示:



2. 然后告诉Visual Studio我们希望做RPC调试,点击”—“调试(Debugging)”—“ 非托管程序(Native)”,选中“启用RPC调试(Enable RPC Debugging)” 复选框,如下图所示:



调试步骤
打开COM客户端的源代码工程,执行到远程COM方法调用的时候,单击F11,这个时候Visual Studio会弹出一个RPC设置对话框,选中“非托管(Native)程序”复选框,点击“确定(OK)”,最后等一会你就会发现Visual Studio停在了COM服务端TestComMethod的入口处。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐