DLL动态加载时调用类成员函数小结

//dll 动态加载  调用 类 函数小结:

静态加载时,调用类成员函数,很简单。此次研究了下动态加载。

首先困难点:
The first problem is that C++ member function names are decorated names (Specifying extern "C" does not help).
The second problem is that C++ language specifications do not allow pointer to member functions to be converted into other types

1.  .def 中,  DCls2_f = [email protected]@@QAEXXZ
    exe中,    DCls2_f* c1 = (DCls2_f*)malloc(sizeof(DCls2_f));

方法1:

                __asm { MOV ECX, c1 }//vs push this
                FUNC f = GetProcAddress()...
                f();//由于已放好this,可直接调用

方法2:

                typedef void (DCls2::*MemFunc)();
                typedef void (*GlbFunc)();
                union uni { MemFunc mf; GlbFunc gf; } u1;
                u1.gf = GetProcAddress()...
                MemFunc mf = u1.mf;
                (c1->*mf)();

2.  继承接口基类,封装虚函数接口,返回指针调用,即可解决编译链接时错误,再运行时动态绑定虚函数(只要是虚函数就可以用于dll导出了,
        就不会因为没有实现而出现链接错误,因为是(this->vtbl[1])()来调用,而不是通过函数符号DCls2::f;
        继承基类接口,只是更好的风格,为了封装扩展)

dll:

            class IBase { virtual void f(); };//also could pure virtual
            class DCls2 : public IBase { virtual void f(); };
            IBase* createIns();//impl: return (IBase*)new DCls2; //will dync bind virtual func addr, 
            //i.g: this->vtbl = _DCls2_vtbl (而_DCls2_vtbl[1] = DCls2::f)

exe:

            IBase* c1 = createIns();
            c1->f();//will not link err, because f is virtual 对于虚函数,无实现不会链接出错

3.  将class 包装成对外的C接口吧,做一个wrapper,我觉得还是这样比较好,不会有DLL Hell的问题,毕竟DLL本来就是为C函数服务设计的。

时间: 2024-11-25 00:51:04

DLL动态加载时调用类成员函数小结的相关文章

java动态加载指定的类或者jar包反射调用其方法

序言 有时候,项目中会用到java动态加载指定的类或者jar包反射调用其方法来达到模块的分离,使各个功能之间耦合性大大降低,更加的模块化,代码利用率更高.模式中的代理模式就用到java的这一机制.下边就让我们通过代码来看看如何实现此功能. 代码详细 package loadjarclass; import java.io.File; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoad

java反射并不是什么高深技术,面向对象语言都有这个功能,而且功能也很简单,就是利用jvm动态加载时生成的class对象

java反射并不是什么高深技术,面向对象语言都有这个功能. 面向对象语言都有这个功能,而且功能也很简单,就是利用jvm动态加载时生成的class对象,去获取类相关的信息 2.利用java反射可以调用类的私有方法么?private()方法 答:可以,class取出method,method继承executable类,executable类继承AccessibleObject类,AccessibleObject有个setAccessiable()设置这个方法是否可访问. 则设置成true,就可将pr

理解ATL中的一些汇编代码(通过Thunk技术来调用类成员函数)

我们知道ATL(活动模板库)是一套很小巧高效的COM开发库,它本身的核心文件其实没几个,COM相关的(主要是atlbase.h, atlcom.h),另外还有一个窗口相关的(atlwin.h), 所以拿来学习应该是很方便的.但是因为ATL的代码充满了模板和宏,内部还夹杂着汇编,所以如果没有比较丰富的C++模板和系统底层的知识,一般人会看得一头雾水. 下面我们主要分析一下ATL中的一些汇编代码. ATL中出现汇编代码主要是2处,一处是通过Thunk技术来调用类成员函数处理消息:还有一处是通过打开_

直接调用类成员函数地址(用汇编取类成员函数的地址,各VS版本还有所不同)

在C++中,成员函数的指针是个比较特殊的东西.对普通的函数指针来说,可以视为一个地址,在需要的时候可以任意转换并直接调用.但对成员函数来说,常规类型转换是通不过编译的,调用的时候也必须采用特殊的语法.C++专门为成员指针准备了三个运算符: "::*"用于指针的声明,而"->*"和".*"用来调用指针指向的函数. // Thunk.cpp : Defines the entry point for the console applicatio

【EasyUI】使用Jquery.load动态加载时重新渲染

EasyUI重新渲染: $.parser.parse('#app'); // 重新渲染 #app 下的元素 添加个扩展方法(方便使用): 1 $.fn.extend({ 2 Load:function (url,fun) { 3 var $this = this; 4 $(this).load(url,function (resp,status,xhr) { 5 $.parser.parse($this); 6 fun(resp,status,xhr); 7 }); 8 } 9 }); 使用Lo

php自动加载带命名空间类的函数

代码: <?php /* @desc:自动加载类的函数 @param dir 需要注册自动加载的文件夹 */ function autoloader($dir){ spl_autoload_register(function($name) use ($dir){ $name = str_replace('\\',DIRECTORY_SEPARATOR,$name); require $dir.DIRECTORY_SEPARATOR.$name.'.php'; }); } 测试: autoload

js页面加载时调用函数方法

方法一:在html的body中加入onload=""事件 <body onload='queryServer()'> </body> 方法二:jquery 中:$(function(){}) //方法体里面写调用方法 <!-- 全局js --><script src="../js/jquery.min.js?v=2.1.4"></script> <script type="text/java

动态加载和动态注册类技术的深入探索

Delphi的包是Delphi IDE的核心技术,没有包也就没有了Delphi的可视化编程.包也可以用在我们开发的项目中,其好处是可以代码共享,减小工程尺寸,单纯通过替换包文件就能实现工程的升级和补丁.但是我们要加载包,就要知道包中已经存在的类.关于如何动态加载包的资料比比皆是我就不想就此问题讨论了.但是Delphi的IDE很是特殊,它无需事先知道你的包有哪些类就能注册组建,创建组建.但是Borland没有公开BPL文件的格式.我们自己是否可以实现IDE的功能呢?首先我们知道.一个组件包想要能在

[翻译]-Linux上C++类的动态加载

摘要:本文是翻译文章,主要介绍了运行时重载C++类的技术,包括了Linux上的动态加载接口.C++类的动态加载技术点及实现.自动加载技术等.最后给出了两个应用案例及相关的源代码.   关键字:动态加载,C++类,Linux 原文链接:http://porky.linuxjournal.com:8080/LJ/073/3687.html   推荐: (原文)http://www.tldp.org/HOWTO/text/C++-dlopen (翻译)http://hi.baidu.com/clive