C++和C#之间互相调用经验详谈
作者:网络转载 发布时间:[ 2014/1/23 9:28:24 ] 推荐标签:C++ C#
得到this指针及成员函数地址。
CInterface *pInterface = new CInterface;
DWORD base_proc = (*((DWORD *)(pInterface))); //虚表指针
DWORD f1 = *(( DWORD *)base_proc); //第1个
DWORD f2 = *(( DWORD *)(base_proc + 4)); //第2个
DWORD f3 = *(( DWORD *)(base_proc + 8)); //第三个
到时将值赋值到SAFEARRAY 安全数组中,在传递到C#中。
看看在C#中时如何使用的把。当然这一部分的内敛、委托、开辟内存、托管到非托管转换时少不了的,老规矩,看代码把。
先定义委托和内敛。
//委托 参数分别为 this指针 成员函数地址 参数
delegate void testcall(int pthis, int pfun, int param);
byte[] codetest = {
// 0xCC,
0x8B, 0x5C, 0x24, 0x0C, //mov ebx,[esp+0Ch] 第三个参数 @@
0x8B, 0x44, 0x24, 0x08, //mov eax,[esp+08h] 函数地址
0x8B, 0x4C, 0x24, 0x04, //mov ecx,[esp+04h] this 指针
0x53, //push ebx 参数入栈 @@
0xFF, 0xD0, //call eax
0xC3 // ret
};
书写内敛汇编当然可以考研我们的功底啦,看看你知道不知道底层是如何实现的、如何入栈、出栈、传值、传指针、传引用、堆栈平衡等。还有一点,书写汇编虽容易,但是机器指令我们并不都知道,山人自有妙计,汇编代码贴到VC中,ALT+8看反汇编,在拷贝回来即可。
以上代码中,完成接口第三个函数调用,带有一个整形参数,并且传值。
注释掉@@部分完成接口第二个函数调用,无参数。
为了简便都写在一个里面,实际运用中,你可以按照不同格式分开。
接下来看看如何调用,,主要代码如下。
VirtualAlloc。。。。。。之前肯定得先开辟内存啊
Marshal.Copy(codetest, 0, handle, codetest.Length);
testcall Customer = Marshal.GetDelegateForFunctionPointer(handle, typeof(testcall)) as testcall;
int bb = 22;
Customer (fun[0], fun[4], bb);
不错,这是子模块调用父相关逻辑的主要实现。
3. 后话
这是相互调用的所有部分吗?这次答案是否定,实际上远远不至于此,我们此次实现的,只是基本的部分,尤其在参数上,我们用的简单的类型 int,实际使用中,对于两者之间都存在的基本类型,还好说一点,当涉及到字符串、数组、结构体等这些类型时,真的会让你很麻烦的,尤其是字符串,两边还不一样。。。。。
其中对参数类型来说,我们用的是传值方式,直接将值push,对于引用或者指针要把其地址push,可以实现了,当然还是针对基本的类型来说的。
对于字符串参数的,我用全局函数实现了一个接口(具体的可以看代码),这样其中大部分转换操作,对我们透明了,为何不自己搞?我有时间在补充进去把,这些留给你们了,同样你们搞出来之后要告诉我啊,这里给大家一个建议,处理字符串时,在C#中好使用char数组,但在书写内敛汇编时要注意,数组前面可有数组的大小,要偏移过去。
。。。。
。。。。
等把这一切都搞定之后,动态创建、嵌入VB的、C#的、WPF的以及她3D部分、硬件加速部分。。。。。。。。。
不错,如此看来,现在才刚刚开始。。。。。。。。。。。。。
希望能给大家起到一个抛砖引玉作用。
后附一个类型转换的帖,供使用参考,类型转换我不?嗦了。
http://topic.csdn.net/u/20090225/15/a6bc50ad-9721-4749-b189-dc4a4bc045a1.html
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11