向ATL DLL中传递C++对象

简介

几个星期以前,我拼命的寻找一个能够通过COM接口传递C++对象的例子,但是,没有找到.这就是我发表这篇文章的原因。

向ATL的DLL中传递一个C++对象参数并不是非常之难,但是,当然也会有点难度,也很有趣。

在开始一个工程以前,首先你得确信客户机和服务器组件都是适应C++的程序,其次,你必须知道怎样设置你的客户机和服务器。

接口的局限性

COM技术要求客户机和服务器高度的分离,这是通过接口实现的,但是问题出在:接口的方法中只提供了有限个参数数据类型,如果这个接口是基于IDispatch的,参数类型的可选范围就更加受到限制了,由于这些局限性,C++对象只有在满足以下条件时才能够传递:

客户机和服务器都是由VC++编写。

它们必须共享对象的定义(比如 头文件)。

传递应用程序设计的简单的对象。

你的应用程序可能需要运行在一个分布式环境下。你希望COM的远程活动,本地/远程活动是透明的,安全的。

我建议,在开始工作之前,先顺序的看一下各个标题,现在,我列出实例,并作以下事情:

创建一个ATL DLL服务器,

添加一个MFC类,从CObject类派生,

在类的头部使用 DECLARE_SERIAL 宏,

在类的中间使用 IMPLEMENT_SERI 宏,

覆盖Serialize() 方法,// 你的 CSimpleObj 类应该像这样:
class CSimpleObj : public CObject
{
     DECLARE_SERIAL( CSimpleObj )
public:
   // 构造函数和析构函数
     CSimpleObj();
     virtual ~CSimpleObj();
   // 设置内部字符串数据
     void SetString( CString csData );
   // 用来向存档文件串行输入数据(序列化)
     virtual void Serialize(CArchive& ar);
   // 现实字符串数据
     void Show();
private:
     CString m_strData;// 内部字符串数据
};
// 把这个数据对象写入到文档中
void CSimpleObj::Serialize(CArchive& ar)
{
     CObject::Serialize( ar );
   if (ar.IsLoading())
   {
     // 从档案文件提取数据
       ar >> m_strData;
   }
   else
   {
     // 把数据存入档案文件
       ar << m_strData;
   }
}
// 显示对象数据的方法
void CSimpleObj::Show()
{
     AfxMessageBox(m_strData);
}
//把字符串数据保存到一个变量中
void CSimpleObj::SetString(CString csData)
{
     m_strData = csData;
}

时间: 2025-01-20 11:28:24

向ATL DLL中传递C++对象的相关文章

DLL中传递STL参数,vector对象作为dll参数传递等问题(转)

STL跨平台调用会出现很多异常,你可以试试. STL使用模板生成,当我们使用模板的时候,每一个EXE,和DLL都在编译器产生了自己的代码,导致模板所使用的静态成员不同步,所以出现数据传递的各种问题,下面是详细解释. 原因分析:一 句话-----如果任何STL类使用了静态变量(无论是直接还是间接使用),那么就不要再写出跨执行单元访问它的代码. 除非你能够确定两个动态库使用的 都是同样的STL实现,比如都使用VC同一版本的STL,编译选项也一样.强烈建议,不要在动态库接口中传递STL容器!! STL

DLL中传递STL参数

以下是自己在调测代码过程出现问题后,搜索出来的资料,虽然很乱,但明白了在跨DLL传递stl中的容器类对象时存在问题的原因及解决办法,故保存之. STL跨平台调用会出现很多异常,你可以试试. STL使用模板生成,当我们使用模板的时候,每一个EXE,和DLL都在编译器产生了自己的代码,导致模板所使用的静态成员不同步,所以出现数据传递的各种问题,下面是详细解释. 原因分析: 一句话-----如果任何STL类使用了静态变量(无论是直接还是间接使用),那么就不要再写出跨执行单元访问它的代码. 除非你能够确

ui-UI中Intent要在跳转过程中传递bundle对象,为什么要实现Serializable?

问题描述 UI中Intent要在跳转过程中传递bundle对象,为什么要实现Serializable? Intent要在跳转过程中传递bundle对象,为什么要实现Serializable? 解决方案 ....看情况啊,如果只是普通的bundle对象是不需要实现Serializable的,当bundle中要传递的是一个对象时才要实现该接口.实现serializable接口的作用是就是可以把对象存到字节流,然后可以恢复.

C++ dll中的对象方法中怎么调用到C#中的回调类对象

问题描述 手上有一个c++的dll,想在c#中调用.c++dll中的普通对象方法已经能够调用成功.但问题是:dll中的类对象中设计有一个回掉接口.dll中的类方法分别会调用这个回掉接口中的方法.外部调用这个dll时只要实现这个回调接口,在初始化时将这个回调接口的实现类对象指针传给dll的类对象,就能实现回掉函数的调用.想在C#中实现这个回调接口.能实现吗?或者有没有其他小技巧.如何做? 解决方案 解决方案二: 解决方案三:回调用委托实现,注意委托尽量少用临时变量,以免被GC释放.解决方案四:可以

javascript数组与VB DLL中中数组的传递问题

各位:我现在在JavaScript中定义一个一维数组,然后调用VB编写的DLL对象,在DLL对象给此数组赋值,然后在JavaScript读出已经赋值的数组.请问如何操作. DLL对象: TestPrj.Test Public Sub Test(strName() As Variant) strName(0) = "MR " strName(1) = "zhang "End Sub JavaScript: <Script language= 'JavaScrip

c++ 中制作 atl com 复合组件,能在c++的dll中调用吗

问题描述 c++ 中制作 atl com 复合组件,能在c++的dll中调用吗 我写了一个atl com的复合组件,里面就一个浏览器的控件拖上去而已,想在一个dll中调用这个com组件,然后就会启动一个浏览器窗口,但是我dll连到这个com组件的方法中的时候,这个浏览器窗口就是不会自动显示,请问如何让这个com组件展示?并且我希望能够操作这个浏览器去访问某个地址,请问我该如何去操纵这个浏览器控件? 解决方案 这么做很不安全,要考虑你的com对象的线程模型,如果是公寓线程,是不能调用webbrow

在C# dll中如何获得主程序的实例对象

问题描述 如题,主要是想在DLL中获得的数据,在主程序界面上显示,故如何做呢 解决方案 解决方案二:主程序和你的dll有什么关系,把问题说的清楚些解决方案三:调用Process.GetCurrentProcess获得exe的进程对象,解决方案四:没看明白解决方案五:如果只是数据传递的问题,很简单,exe程序调用dll里的方法,把实例引用传给dll就可以,

【谢谢】repeater 中调用后台的方法时,怎么能直接传递整个对象?

问题描述 repeater中调用后台的方法时,怎么能直接传递整个对象?比如:<%a(Eval("字段"))%> 是<%%>,不是<%#%>~这样的话,调方法a,传单个字段.如果参数要多,就傻了.怎么才能传递整个对象呢~?谢谢 解决方案 解决方案二:什么是<%%>?你真的是在此输出内容吗?什么叫做"传递单个字段.传递整个对象"?你使用Eval的含义不就是传递字段吗,那么你把Eval()改为对象不就行了嘛.不过我觉得控怕你

asp.net 中传递、返回复杂类型的对象(1/3)

上面的服务传递的是简单数据类型,返回的也是简单数据类型.下面我们用javabean .list.map.array等返回值或参数完成webservice. 1.首先看看javabean模式的参数和返回值的webservice,javabean代码如下:   代码 package com.hoo.entity; import java.io.serializable; /**  * <b>function:</b>user entity  * @author hoojo  * @cr