aardio 官方社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 58972|回复: 30

调用C语言写个DLL,几句代码搞定

 火 [复制链接]

42

主题

625

回帖

3755

积分

版主

积分
3755
发表于 2012-12-23 12:15:48 | 显示全部楼层 |阅读模式
调用C语言写个DLL,几句代码搞定:

  1. code = /**
  2.     #include <windows.h>
  3.    
  4.     /*
  5.     入口函数,该函数可以有也可以没有。
  6.    
  7.     入口函数会自动加锁以保证线性调用,要避免在DllMain内调用下列函数:
  8.     1、调用LoadLibrary或其他可能加载DLL的API函数( CreateProcess等 )
  9.     2、可能再次触发DllMain的函数,例如 CreateThread,ExitThread
  10.     3、GetModuleFileName, GetModuleHandle 等其他可能触发系统锁的API函数
  11.     总之在DllMain最好不要调用API函数.
  12.     */
  13.     int __stdcall DllMain(void * hinstDLL, unsigned long fdwReason, void * lpvReserved) {
  14.    
  15.         if (fdwReason == 1/*DLL_PROCESS_ATTACH*/ ){
  16.             
  17.         }
  18.         return 1;
  19.     }
  20.    
  21.     //__declspec(dllexport) 声明导出函数
  22.     __declspec(dllexport) int Msgbox( const char * str )
  23.     {   
  24.         MessageBox( 0,str,"C语言DLL组件",MB_OK);
  25.         return 0;
  26.     }  
  27. **/

  28. import tcc;
  29. vm = tcc( );//创建TCC编译器
  30. vm.addLib( "user32","kernel32","gdi32" ) //引用库
  31. vm.output( "/bin.dll", code ) //编译C源码,生成DLL
  32. vm.close(); //收工

  33. //加载生成的DLL
  34. var dll = raw.loadDll( "/bin.dll",, "cdecl" );//第三个参数指定C语言调用约定:cdecl

  35. //声明API函数
  36. Msgbox = dll.api( "Msgbox","int(string str)");
  37. Msgbox( "C语言你好!" );

  38. //不声明也可以直接调用API函数,如下:
  39. dll.Msgbox( "C语言你好!" );
复制代码


调用VC++写个DLL,几句代码搞定:


  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(
  64.     topointer(pTest),
  65.     class {
  66.         pointer getName = "void(string &buffe,int len)";
  67.         pointer getInfo = "bool(struct &pInfo)";
  68.     },"thiscall" //注意调用约定为thiscall
  69. )

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

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

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

0

主题

19

回帖

147

积分

一级会员

积分
147
发表于 2012-12-23 13:40:40 | 显示全部楼层
            定一个!!!!!!!!!!!!!!!!

19

主题

293

回帖

1945

积分

新手入门

积分
1945
发表于 2012-12-23 14:09:42 | 显示全部楼层
高级,好玩

23

主题

380

回帖

2200

积分

五级会员

积分
2200
发表于 2012-12-24 10:18:27 | 显示全部楼层
直接将C源码写成DLL然后调用,妙啊。

48

主题

541

回帖

3328

积分

五级会员

积分
3328
发表于 2012-12-24 11:02:25 | 显示全部楼层
本帖最后由 jyb21 于 2012-12-24 11:19 编辑

支持一下,谢谢分享  运行测试成功

0

主题

2

回帖

33

积分

新手入门

积分
33
发表于 2012-12-24 11:04:57 | 显示全部楼层
好东西

12

主题

645

回帖

3938

积分

荣誉会员

子非魚、安知魚之樂

积分
3938
发表于 2012-12-24 11:19:07 | 显示全部楼层
这下可以写dll了

0

主题

71

回帖

475

积分

二级会员

积分
475
发表于 2012-12-24 17:07:15 | 显示全部楼层

0

主题

12

回帖

74

积分

一级会员

积分
74
发表于 2012-12-26 13:01:38 | 显示全部楼层
厉害

0

主题

12

回帖

74

积分

一级会员

积分
74
发表于 2012-12-26 13:10:13 | 显示全部楼层
不知道c#.net写的dll能不能也这样子呢?

9

主题

443

回帖

2546

积分

版主

积分
2546
发表于 2012-12-26 13:40:28 | 显示全部楼层
Likeaardio 发表于 2012-12-26 13:10
不知道c#.net写的dll能不能也这样子呢?

可以的,aardio可以直接调用C#写的DLL,内存加载都可以的。
看aardio范例里的 dotNet库里的代码:
  1. //直接指定文件路径,资源文件路径,或内存数据加载程序集
  2. var Interop = appDomain.loadFile($"~/lib/dotNet/.res/aardio.InteropServices.dll");
  3. var csProxy = Interop.CreateInstance("aardio.InteropServices.CSharp");
复制代码

0

主题

12

回帖

74

积分

一级会员

积分
74
发表于 2012-12-26 14:50:58 | 显示全部楼层
谢谢,有空我也试试把C#的代码写给code变量。 

5

主题

67

回帖

468

积分

二级会员

积分
468
发表于 2012-12-27 03:53:30 | 显示全部楼层
强大,简单,学习了

0

主题

50

回帖

375

积分

二级会员

积分
375
发表于 2013-2-1 09:59:28 | 显示全部楼层
这个好,有空仔细研究一下。

6

主题

123

回帖

1113

积分

四级会员

积分
1113
发表于 2013-2-4 10:07:03 | 显示全部楼层
高级

0

主题

12

回帖

171

积分

一级会员

积分
171
发表于 2013-2-16 20:51:58 | 显示全部楼层
很厉害啊,膜拜

0

主题

15

回帖

92

积分

一级会员

积分
92
发表于 2013-2-27 22:21:42 | 显示全部楼层
good,very good

5

主题

30

回帖

217

积分

二级会员

积分
217
发表于 2013-11-1 21:28:53 | 显示全部楼层
高级的应用,好好研究下

2

主题

2

回帖

37

积分

新手入门

积分
37
发表于 2015-4-27 20:41:10 | 显示全部楼层
真是好东西
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

GMT+8, 2026-10-10 07:41 , Processed in 0.096678 second(s), 22 queries .

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

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