資源描述:
《動態(tài)調(diào)用DLL里的函數(shù)-160921》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、動態(tài)調(diào)用DLL里的函數(shù)Hanford2016年09月21日目錄第1章說明2第1章說明最近發(fā)現(xiàn)了一個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)第一行代碼創(chuàng)建了一個COM對象,其ProgID為“DynamicWrapper”
2、;第二行代碼載入動態(tài)庫KERNEL32.DLL,然后找到函數(shù)CopyFileA的地址;第三行調(diào)用函數(shù)CopyFileA(”c:l.txt”,”c:2.txt”,l),將文件c:l.txt復(fù)制到c:2.txto這里,難度最大的就是第三行代碼。在VC++程序員的角度來看就是有了如下變量:1、CopyFileA的函數(shù)指針FARPROCpFunc;2、傳遞給CopyFileA函數(shù)的參數(shù)數(shù)組VARIANT*。注意:vbs會把三個參數(shù)”c:l.txt”,”c:2.txt”,l變成三個VARIANT,然后從右至左放到一個數(shù)組里,最后把數(shù)組首地址傳給COM對象。現(xiàn)在,如何
3、調(diào)用CopyFileA函數(shù)?下面是模擬DynamicWrapper的VC++代碼:#include#include#pragmawarning(disable:4786)#include
4、#%£#%£#%£#%£#%£#%£#%£#%£#函數(shù)指針參數(shù)數(shù)組首地址。參數(shù)的順序是從左至右參數(shù)個數(shù)調(diào)用約定:非零表示—stdcall,0表示—cdecl/?丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫??丫?pFunc[in]varParam[in]nP
5、aramCount[in]bCdecl
6、in
7、函數(shù)調(diào)用longCallFunc(FARPROCpFunc,VARIANT*varParam,intnParamCount,intbCdecl=0){longnRet=0;if(pFunc){inti二nParamCount;longnParam=0;while(—i>=0){〃參數(shù)從右至左壓入堆棧nParam=varParam[i]」Vai;—asm{pushnParam—asm{〃調(diào)用函數(shù),將返冋值賦給變量nRetcallpFuncmovnRet,eax}if(bCdecl){〃如果調(diào)用約定是_cdecl,需要對寄存器
8、ESP進(jìn)行處理nParamCount?=2;//一個參數(shù)占用4字節(jié)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){//找到函數(shù),放入m_mapFuncCFunct;t.m_hMod=hMod;t.m_pFunc=pFu