VS2005 MFC 开发COM 遇到的问题,高手请进.
添加一个继承自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,从制作到发布的全过程 有详细的截图 适合初学控件的程序猿
VC++编写的券商ActiveX登录与下单调试工程(VS2005/2008)
这是一个开箱即用的VC++程序化交易调试工程,专为对接国内支持ActiveX接入方式的券商交易系统设计。工程包含完整的登录对话框界面(test_loginDlg)、主程序逻辑(test_login)、资源文件及必需的AX控件依赖库axstock.lib,可直接编译运行。项目基于Visual Studio 2005或2008格式(.vcproj),采用标准Windows API构建UI交互流程,支持账号密码输入、会话初始化、基础委托指令触发等核心功能。配套ReadMe.txt提供清晰的编译步骤说明,其余如Th
使用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...
Vs2005的Activex
Vs2005的Activex 学习Demo


