测试示例
相关链接 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 }