现在的位置: 首页 > 综合 > 正文

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

2013年09月09日 ⁄ 综合 ⁄ 共 3704字 ⁄ 字号 评论关闭

假设你现在正在开发一个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)” 复选框,如下图所示:

启动RPC调试

 

调试步骤

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

 

 

假设你现在正在开发一个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)” 复选框,如下图所示:

启动RPC调试

 

调试步骤

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

 

 

抱歉!评论已关闭.