搜索
查看: 31494|回复: 29

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

    [复制链接]

43

主题

679

帖子

3805

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3805
发表于 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

主题

21

帖子

150

积分

一级会员

Rank: 2

积分
150
发表于 2012-12-23 13:40:40 | 显示全部楼层

定一个!!!!!!!!!!!!!!!!

            定一个!!!!!!!!!!!!!!!!
回复

使用道具 举报

20

主题

325

帖子

1942

积分

荣誉会员

Rank: 8Rank: 8

积分
1942
发表于 2012-12-23 14:09:42 | 显示全部楼层

高级,好玩

高级,好玩
回复

使用道具 举报

23

主题

412

帖子

2244

积分

五级会员

Rank: 8Rank: 8

积分
2244
发表于 2012-12-24 10:18:27 | 显示全部楼层

直接将C源码写成DLL然后调用,妙啊。

直接将C源码写成DLL然后调用,妙啊。
回复

使用道具 举报

48

主题

593

帖子

3329

积分

五级会员

Rank: 8Rank: 8

积分
3329
发表于 2012-12-24 11:02:25 | 显示全部楼层

[i=s] 本帖最后由 jyb21 于 2012-12-24 11:19 编辑 [/i] 支持一下,谢谢分享 运行测试成功

本帖最后由 jyb21 于 2012-12-24 11:19 编辑

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

使用道具 举报

0

主题

2

帖子

33

积分

新手入门

Rank: 1

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

好东西{:3_51:}

好东西
回复

使用道具 举报

10

主题

586

帖子

3432

积分

荣誉会员

子非魚、安知魚之樂

Rank: 8Rank: 8

积分
3432
发表于 2012-12-24 11:19:07 | 显示全部楼层

这下可以写dll了{:D}

这下可以写dll了
回复

使用道具 举报

0

主题

75

帖子

480

积分

二级会员

Rank: 3Rank: 3

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

{:3_41:}

回复

使用道具 举报

0

主题

13

帖子

179

积分

一级会员

Rank: 2

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

厉害

厉害
回复

使用道具 举报

0

主题

13

帖子

179

积分

一级会员

Rank: 2

积分
179
发表于 2012-12-26 13:10:13 | 显示全部楼层

不知道c#.net写的dll能不能也这样子呢?

不知道c#.net写的dll能不能也这样子呢?
回复

使用道具 举报

9

主题

463

帖子

2556

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2556
发表于 2012-12-26 13:40:28 | 显示全部楼层

[quote][size=2][color=#999999]Likeaardio 发表于 2012-12-26 13:10[/color] [url=forum

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

主题

13

帖子

179

积分

一级会员

Rank: 2

积分
179
发表于 2012-12-26 14:50:58 | 显示全部楼层

谢谢,有空我也试试把C#的代码写给code变量。 

谢谢,有空我也试试把C#的代码写给code变量。 
回复

使用道具 举报

5

主题

74

帖子

455

积分

二级会员

Rank: 3Rank: 3

积分
455
发表于 2012-12-27 03:53:30 | 显示全部楼层

强大,简单,学习了

强大,简单,学习了
回复

使用道具 举报

0

主题

50

帖子

379

积分

二级会员

Rank: 3Rank: 3

积分
379
发表于 2013-2-1 09:59:28 | 显示全部楼层

这个好,有空仔细研究一下。

这个好,有空仔细研究一下。
回复

使用道具 举报

6

主题

132

帖子

1094

积分

四级会员

Rank: 6Rank: 6

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

高级

高级
回复

使用道具 举报

0

主题

12

帖子

173

积分

一级会员

Rank: 2

积分
173
发表于 2013-2-16 20:51:58 | 显示全部楼层

很厉害啊,膜拜

很厉害啊,膜拜
回复

使用道具 举报

0

主题

15

帖子

77

积分

一级会员

Rank: 2

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

good,very good

good,very good
回复

使用道具 举报

5

主题

35

帖子

222

积分

二级会员

Rank: 3Rank: 3

积分
222
发表于 2013-11-1 21:28:53 | 显示全部楼层

高级的应用,好好研究下

高级的应用,好好研究下
回复

使用道具 举报

2

主题

4

帖子

35

积分

新手入门

Rank: 1

积分
35
发表于 2015-4-27 20:41:10 | 显示全部楼层

真是好东西

真是好东西
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

GMT+8, 2017-11-23 20:50 , Processed in 0.062500 second(s), 18 queries , WinCache On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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