资源描述:
《动态调用DLL里的函数-160921》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、动态调用DLL里的函数Hanford2016年09月21日目录第1章说明2第1章说明最近发现了一个COM组件DynamicWrapperX,有了它就可以在vbs、js里方便、快捷的访问WindowsAPI了。卜•面是一段vbs代码:SetWrap=CreateObjectC'DynamicWrapper")Wrap.RegisteLKERNEL32.DLL”,nCopyFileAn,,,i=ssF,,,,R=r,Wrap.CopyFileA(”c:l・txt”,“c:2.txt”,1)第一行代码创建了一个COM对象,其ProgID为“DynamicWrapper”
2、;第二行代码载入动态库KERNEL32.DLL,然后找到函数CopyFileA的地址;第三行调用函数CopyFileA(”c:l.txt”,”c:2.txt”,l),将文件c:l.txt复制到c:2.txto这里,难度最大的就是第三行代码。在VC++程序员的角度来看就是有了如下变量:1、CopyFileA的函数指针FARPROCpFunc;2、传递给CopyFileA函数的参数数组VARIANT*。注意:vbs会把三个参数”c:l.txt”,”c:2.txt”,l变成三个VARIANT,然后从右至左放到一个数组里,最后把数组首地址传给COM对象。现在,如何
3、调用CopyFileA函数?下面是模拟DynamicWrapper的VC++代码:#include#include#pragmawarning(disable:4786)#include
4、#%£#%£#%£#%£#%£#%£#%£#%£#函数指针参数数组首地址。参数的顺序是从左至右参数个数调用约定:非零表示—stdcall,0表示—cdecl/・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・・丫・pFunc[in]varParam[in]nP
5、aramCount[in]bCdecl
6、in
7、函数调用longCallFunc(FARPROCpFunc,VARIANT*varParam,intnParamCount,intbCdecl=0){longnRet=0;if(pFunc){inti二nParamCount;longnParam=0;while(—i>=0){〃参数从右至左压入堆栈nParam=varParam[i]」Vai;—asm{pushnParam—asm{〃调用函数,将返冋值赋给变量nRetcallpFuncmovnRet,eax}if(bCdecl){〃如果调用约定是_cdecl,需要对寄存器
8、ESP进行处理nParamCount«=2;//一个参数占用4字节asmaddesp,nParamCountreturnnRet;}classCDynamicWrapper{public:〜CDynamicWrapper(){for(std::map::iteratorit=m_mapFunc.begin();it!=m_mapFunc.end();++it){〃卸载DLLFreeLibrary(it->second.m_hMod);}}public:voidRegister(LPCTSTRszDUName,constchar*s
9、zFuncName,intbCdecl=0)if(szDHName&&szDllName[O]){〃注册if(szFuncName&&szFuncName[O]&&m_mapFunc.find(szFuncName)==m_mapFunc.end()){HMODULEhMod=LoadLibrary(szDllName);if(hMod){FARPROCpFunc二GetProcAddress(hMod,szFuncName);if(pFunc){//找到函数,放入m_mapFuncCFunct;t.m_hMod=hMod;t.m_pFunc=pFu