dyncall 运行时(runtime)动态生成回调函数,和调用函数

测试示例

相关链接  http://dyncall.org/stable/manual.pdf

 1 int testfunc(int a,double d)
 2 {
 3     printf("testfunc: %d %.2f\n",a,d);
 4     return 123;
 5 }
 6 void testcall()
 7 {
 8     DCCallVM* vm = dcNewCallVM(4096);
 9     
10     dcReset(vm);
11     dcArgInt(vm,999);
12     dcArgDouble(vm,123.456);
13     int i = dcCallInt(vm,(void*)&testfunc);
14     dcFree(vm);
15     printf("return: %d\n",i);
16 }
17 char cbHandler(DCCallback* cb, DCArgs* args, DCValue* result, void* userdata)
18 {
19     int ud = *(int*)userdata;
20     //printf("ud:%d\n",ud);
21     int hwnd = dcbArgInt(args);
22     int lp = dcbArgInt(args);
23     char wt[1024];
24     int nLen = GetWindowTextA((HWND)hwnd,wt,1024);
25     if(nLen)printf("win: %s\n",wt);
26     //printf("arg: %s\n",dcbArgPointer(args));
27     result->i = 1;
28     return 'i';
29 }
30 void testCallBack()
31 {
32     DCCallback* cb ;
33     int result = 0;
34     int userdata = 1337;
35     
36     printf("about to callback...\n");
37     cb = dcbNewCallback("_sii)v", &cbHandler, &userdata);
38     result = EnumWindows((WNDENUMPROC)cb,123);
39     //result = ((int(*)(HWND,LPARAM))cb)(123,"aaaa");
40     dcbFreeCallback(cb);
41     printf("return value (should be 1234): %d\n", result);
42 
43 
44 }
45 void testcallapi()
46 {
47     DCCallVM* vm = dcNewCallVM(4096);
48     dcMode(vm,DC_CALL_C_X86_WIN32_STD);
49     dcReset(vm);
50     
51     dcArgInt(vm,0);
52     dcArgPointer(vm,L"abc");
53     dcArgPointer(vm,L"caption");
54     dcArgInt(vm,4096);
55     DLLib * pLib = dlLoadLibrary("user32.dll");
56     int i = dcCallInt(vm,(void*)dlFindSymbol(pLib,"MessageBoxW"));
57     if(vm)dcFree(vm);
58     dlFreeLibrary(pLib);
59     
60     printf("return: %d\n",i);
61 }
62 void getdllfuncnames()
63 {
64     DLLib * pLib = dlLoadLibrary("shell32.dll");
65     DLSyms * pSym = dlSymsInit(pLib);
66     int iCount = dlSymsCount(pSym);
67     printf("count:%d\n",iCount);
68     printf("62: %s\n",dlSymsName(pSym,97));
69 //     for (int i=0;i<iCount;i++)
70 //     {
71 //         void * proc = dlSymsValue(pSym,i);
72 //         printf("%s\n",dlSymsName(pSym,i));
73 //         printf("%d \n",*(DWORD*)dlFindSymbol(pLib,dlSymsName(pSym,i)));
74 //     }
75 }
76 int _tmain(int argc, _TCHAR* argv[])
77 {
78     //testcall();
79     testcallapi();
80     //testCallBack();
81     //getdllfuncnames();
82     system("pause");
83     return 0;
84 }

 

转载于:https://www.cnblogs.com/akmm88/p/3205333.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值