搜索
aardio官方社区 门户 查看主题

怎样调用DLL中的C++导出类

发布者: beituibaba | 发布时间: 2011-12-19 17:00| 查看数: 8838| 评论数: 5|帖子模式

拿到了一个dll和测试的C++代码,现在想在aardio中载入该dll实现与C++测试代码一样的功能。
测试代码中有一些类的定义,类成员函数多为virtual虚函数,也就是说没有具体如何实现的代码,猜测主要部分应该是在dll中实现的。
现在遇到的问题是:在aardio中可以载入dll,但是如何可以调用dll中的类成员函数呢?

用aardio实现的第一步还没迈出去,抱歉米有啥代码可供参考了。。。
菜鸟求助,鞠躬~

最新评论

编程 发表于 2011-12-19 20:40:44

参考java库的源码, 里面有aardio调用C++的类对象

参考java库的源码, 里面有aardio调用C++的类对象
Jacen.He 发表于 2015-5-24 10:23:42

如果需要在aardio中调用C++的类 1、直接增加一个DLL转换为普通API,因为C++的类并不是为其他语言设计的、就算能在其他语言中调用C++的类、也

如果需要在aardio中调用C++的类

1、直接增加一个DLL转换为普通API,因为C++的类并不是为其他语言设计的、就算能在其他语言中调用C++的类、也没有C++直接调用C++的类方便,所以这部分调用代码不如直接用C++去写。

2、C++里实现COM IDispatch接口, 如果是直接返回COM对象指针,可以使用 com.QueryObject( )转换为aardio对象。

3、使用 raw.interface 转换C++类创建的实例,只能支持C++对象的虚函数成员,示例有java扩展库、hge扩展库等等,下面是范例里的代码:


  1. import vc6;
  2. import console;
  3. var vc = vc6( "/",, console.open() )  

  4. //输入C++源码
  5. vc.cpp = /******
  6.     #include <windows.h>
  7.       
  8.     struct TestInfo{
  9.         int x;
  10.         int y;
  11.         BYTE name[256];
  12.     };
  13.    
  14.     class CTestObject
  15.     {
  16.     public:
  17.         //注意函数声明前加上virtual以支持aardio中的raw.interface
  18.         virtual        void getName(char *buffer,int len);
  19.         virtual        BOOL getInfo(TestInfo *pInfo);
  20.     };
  21.    
  22.     void CTestObject::getName(char *buffer,int len){
  23.         strcpy(buffer,"测试");
  24.     }
  25.    
  26.     BOOL CTestObject::getInfo(TestInfo *pInfo){
  27.         pInfo->x = 1;
  28.         pInfo->y = 2;
  29.         strcpy((char *)pInfo->name,"测试");
  30.         return TRUE;
  31.     }
  32.    
  33.     extern "C" __declspec(dllexport) CTestObject* __cdecl CreateTestObject() {
  34.         return new CTestObject();
  35.     }
  36.    
  37.     extern "C" __declspec(dllexport) void __cdecl DeleteTestObject( CTestObject* pTest) {
  38.         delete pTest;
  39.     }
  40. ******/

  41. /*
  42. vc.exec(
  43. "rc.exe /l 0x804 test.rc"
  44. )
  45. */

  46. //编译生成DLL
  47. vc.exec(
  48.     'cl *.cpp'
  49.     ,'/W3' /*警告等级*/
  50.     ,'/MD' /*使用多线程动态运行库*/
  51.     ,'/O2 /Ot /EHsc' /*代码优化选项*/
  52.     ,'/D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL"' /*定义常数和宏*/
  53.     ,'/I"./INCLUDE"'/*指定头文件目录*/
  54.     ,'kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib' /*导入库*/
  55.     ,'/link /SUBSYSTEM:WINDOWS /MACHINE:X86' /*后面是链接参数 */
  56.     ,'/out:test.dll'/*输出文件名*/
  57.     ,'/dll' /*输出DLL*/
  58.     ,'/LIBPATH:".\LIB" /LIBPATH:".\LIB2"' /*指定库目录*/
  59. )

  60. var dll = raw.loadDll("/test.dll",,"cdecl");
  61. var pTest = dll.CreateTestObject();

  62. import raw.interface;
  63. var testObject = raw.interface( pTest,"
  64.     void getName(string &buffe,int len);
  65.     bool getInfo(struct &pInfo);
  66.     ","thiscall" //注意调用约定为thiscall
  67. )

  68. console.log( testObject.getName(25,25)  )

  69. var ret,info = testObject.getInfo({ int x;int y;BYTE name[256]})
  70. console.log( info.name  )
  71. console.pause()

  72. dll.DeleteTestObject( pTest );
复制代码


dzkaiwen 发表于 2016-3-16 21:40:13

学习了.............谢谢版主

学习了.............谢谢版主
madeitcwang 发表于 2016-3-23 08:32:46

学习了,谢谢

学习了,谢谢
messias 发表于 2017-2-17 14:38:13
学习。。。。。。。。。。。。。

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2017-11-21 16:06 , Processed in 0.109375 second(s), 18 queries , WinCache On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表