VS2005 MFC 开发COM 遇到的问题,高手请进.

VCHelp之乐天蛋黄派 VCHelp之乐天蛋黄派 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
我用VS2005 生成一个MFC DLL(支持自动化).

添加一个继承自CCmdTarget的类, 然后使用MFC标准方法添加接口与类厂(代码如下).问题是在客户程序中用CoCreateInstance创建组件的时候总是返回E_OUTOFMEMORY(在调用前已初始化COM库). 我跟踪程序,发现类厂已经被创建,但类厂却没有创建组件. 由于是标准的类厂实现, 无法跟踪到MFC类厂的代码中. 所以很迷茫.

另外还有一个现象是, 用VC6.0生成一个扩展DLL项目,把这些代码原封不动拷入,编译生成组件. 客户程序就可以正常创建组件,并能正常调用接口.

还有就是我注意到VC6.0没有生成的IDL文件,而VS2005却自动维护一个IDL文件,这个IDL文件中只有组件描述, 没有接口描述, 我手动加上接口描述后, 可调用还是不成功.

1, 接口定义:

#include "stdafx.h"

class ICom2Interface1: public IUnknown
{
public:
virtual void _stdcall Function1() = 0;
virtual void _stdcall Function2() = 0;
};

class ICom2Interface2: public IUnknown
{
public:
virtual void _stdcall Function1() = 0;
virtual void _stdcall Function2() = 0;
};

2, 组件定义:

class CComponetObj : public CCmdTarget
{
DECLARE_DYNCREATE(CComponetObj)
CComponetObj();

protected:
virtual ~CComponetObj();

public:
BEGIN_INTERFACE_PART (TmpObj1, ICom2Interface1)
INIT_INTERFACE_PART (CComponetObj, TmpObj1)
STDMETHOD_(void,Function1)();
STDMETHOD_(void,Function2)();
END_INTERFACE_PART_STATIC(TmpObj1)

BEGIN_INTERFACE_PART (TmpObj2, ICom2Interface2)
INIT_INTERFACE_PART (CComponetObj, TmpObj2)
STDMETHOD_(void,Function1)();
STDMETHOD_(void,Function2)();
END_INTERFACE_PART_STATIC(TmpObj2)

DECLARE_MESSAGE_MAP()
DECLARE_INTERFACE_MAP()
DECLARE_OLECREATE(CComponetObj)

};


组件的实现代码:

// {037439C0-3F86-4309-A129-B3E8E6E94B2F}
extern "C" const GUID IID_ICom2Interface1 =
{ 0x37439c0, 0x3f86, 0x4309, { 0xa1, 0x29, 0xb3, 0xe8, 0xe6, 0xe9, 0x4b, 0x2f } };

// {167722E4-EDF3-4ea8-B085-3A82B2BF8AF1}
extern "C" const GUID IID_ICom2Interface2 =
{ 0x167722e4, 0xedf3, 0x4ea8, { 0xb0, 0x85, 0x3a, 0x82, 0xb2, 0xbf, 0x8a, 0xf1 } };

IMPLEMENT_DYNAMIC(CComponetObj, CCmdTarget)

IMPLEMENT_OLECREATE(CComponetObj, "COM_2.Object",
0xe3ee73ee, 0xced5, 0x429b, 0x9a, 0x6f, 0x9d, 0x32, 0xe1, 0x17, 0x6b, 0x8c);

CComponetObj::CComponetObj()
{
wprintf (L"Constructing CComponetObj!\r\n");
}

CComponetObj::~CComponetObj()
{
}

BEGIN_MESSAGE_MAP(CComponetObj, CCmdTarget)
END_MESSAGE_MAP()

BEGIN_INTERFACE_MAP(CComponetObj, CCmdTarget)
INTERFACE_PART (CComponetObj, IID_ICom2Interface1, TmpObj1)
INTERFACE_PART (CComponetObj, IID_ICom2Interface2, TmpObj2)
END_INTERFACE_MAP()


STDMETHODIMP_(ULONG) CComponetObj::XTmpObj1::AddRef()
{
METHOD_PROLOGUE_EX_(CComponetObj, TmpObj1)
return (ULONG)pThis->ExternalAddRef();
}

STDMETHODIMP_(ULONG) CComponetObj::XTmpObj1::Release()
{
METHOD_PROLOGUE_EX_(CComponetObj, TmpObj1)
return (ULONG)pThis->ExternalRelease();
}

STDMETHODIMP CComponetObj::XTmpObj1::QueryInterface(REFIID iid, LPVOID * ppv)
{
METHOD_PROLOGUE_EX_(CComponetObj, TmpObj1)
return (HRESULT)pThis->ExternalQueryInterface(&iid, ppv);
}

STDMETHODIMP_(void) CComponetObj::XTmpObj1::Function1()
{
METHOD_PROLOGUE_EX_(CComponetObj, TmpObj1)
wprintf (L"ICom2Interface1->Function1 has been called.\r\n");
}

STDMETHODIMP_(void) CComponetObj::XTmpObj1::Function2()
{
METHOD_PROLOGUE_EX_(CComponetObj, TmpObj1)
wprintf (L"ICom2Interface1->Function2 has been called.\r\n");
}

STDMETHODIMP_(ULONG) CComponetObj::XTmpObj2::AddRef()
{
METHOD_PROLOGUE_EX_(CComponetObj, TmpObj2)
return (ULONG)pThis->ExternalAddRef();
}

STDMETHODIMP_(ULONG) CComponetObj::XTmpObj2::Release()
{
METHOD_PROLOGUE_EX_(CComponetObj, TmpObj2)
return (ULONG)pThis->ExternalRelease();
}

STDMETHODIMP CComponetObj::XTmpObj2::QueryInterface(REFIID iid, LPVOID * ppv)
{
METHOD_PROLOGUE_EX_(CComponetObj, TmpObj2)
return (HRESULT)pThis->ExternalQueryInterface(&iid, ppv);
}

STDMETHODIMP_(void) CComponetObj::XTmpObj2::Function1()
{
METHOD_PROLOGUE_EX_(CComponetObj, TmpObj2)
printf ("ICom2Interface2->Function1 has been called.\r\n");
}

STDMETHODIMP_(void) CComponetObj::XTmpObj2::Function2()
{
METHOD_PROLOGUE_EX_(CComponetObj, TmpObj2)
printf ("ICom2Interface2->Function2 has been called.\r\n");
}
...全文

相关推荐

基于MFC的ActiveX控件开发(VS2005)

利用VS2005开发ActiveX,从制作到发布的全过程 有详细的截图 适合初学控件的程序猿

coolcooboy

VC++编写的券商ActiveX登录与下单调试工程(VS2005/2008)

这是一个开箱即用的VC++程序化交易调试工程,专为对接国内支持ActiveX接入方式的券商交易系统设计。工程包含完整的登录对话框界面(test_loginDlg)、主程序逻辑(test_login)、资源文件及必需的AX控件依赖库axstock.lib,可直接编译运行。项目基于Visual Studio 2005或2008格式(.vcproj),采用标准Windows API构建UI交互流程,支持账号密码输入、会话初始化、基础委托指令触发等核心功能。配套ReadMe.txt提供清晰的编译步骤说明,其余如Th

rose2

使用C++在VS2005开发COM组件及C#调用教程

接口是COM(Component Object Model)编程中的核心概念。在COM中,接口定义了一个对象必须实现的一组方法,而不涉及具体如何实现这些方法。这样的设计使得COM组件能够独立于编程语言和平台,因为只要组件遵循接口定义,任何语言编写的程序都可以通过这些接口与之交互。COM接口是通过GUID(全局唯一标识符)来唯一标识的,这保证了接口的全球唯一性。接口的重要性体现在以下几个方面:抽象化和模块化。

张阿拉撕裤

全面详解基于VS2005和SQLServer2005的人力资源管理系统开发

本文还有配套的精品资源,点击获取 简介:本文详细解析了使用Visual Studio 2005和SQL Server 2005开发的人力资源管理系统的构建过程。涵盖了设计理念、技术选型、数据库设计、数据访问技术、用户界面开发、系统架构、安全与优化以及调试与部署等关键方面,为开发类似系统提供参考。 1. Visual Studio 2005开发环境介绍 Vis...

LikYu-餘力

Vs2005的Activex

Vs2005的Activex 学习Demo

longren629
评论 4
收藏 已收藏
分享
返回顶部
VCHelp之乐天蛋黄派
ATL 3,248 成员 48,530 内容