• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            S.l.e!ep.¢%

            像打了激速一樣,以四倍的速度運轉(zhuǎn),開心的工作
            簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
            posts - 1098, comments - 335, trackbacks - 0, articles - 1
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            dll調(diào)用引擎

            Posted on 2010-03-11 08:28 S.l.e!ep.¢% 閱讀(398) 評論(0)  編輯 收藏 引用 所屬分類: VC

            /////////////////////////////////////////////下面是使用此dll調(diào)用引擎的實例代碼
            CDllFunctionCall DllCall;
            /*CHAR szTest1[]="Hello";
            CHAR szTest2[]="Hello, World!";
            std::vector<CDllVariable> Args;
            Args.push_back(CDllVariable(long(0)));
            Args.push_back(CDllVariable("Hello, World!"));
            Args.push_back(CDllVariable("Hello!"));
            Args.push_back(CDllVariable(MB_ICONINFORMATION | MB_YESNO));


            INT iRetB=DllCall.Load("user32.dll","MessageBoxA");

            if(FAILED(iRetB))
            {
            ? AfxMessageBox("找不到相應函數(shù)入口");
            ? return ;
            }
            if(IDYES==(int)DllCall.Invoke(Args,CDllVariable::atInt).Data.IntVal)
            {
            ? AfxMessageBox("檢測到確定按鈕");
            }
            else
            {
            ? AfxMessageBox("檢測到取消按鈕");
            }
            DllCall.UnLoad();*/
            DllCall.Load("Kernel32.dll","DeleteFileA");
            std::vector<CDllVariable> Argss;
            Argss.push_back("c:\\dd.txt");
            BOOL bRet=DllCall.Invoke(Argss,CDllVariable::atInt).Data.IntVal;
            if(bRet)
            {
            ? AfxMessageBox("刪除成功");
            }
            else
            {
            ? AfxMessageBox("刪除失敗");
            }

            ///////////////////////////////////////////下面是此類的頭文件
            #include <vector>class CDllVariable
            {
            public:
            enum CDllVariableType
            {
            ? atBool,
            ? atVoid,
            ? atInt,
            ? atChar,
            ? atWChar,
            ? atDouble,
            ? atFloat,
            ? atInt64
            };
            CDllVariableType Type;
            union
            {
            ? bool BoolVal;
            ? INT IntVal;
            ? CHAR CharVal;
            ? wchar_t WCharVal;
            ? DOUBLE DoubleVal;
            ? FLOAT FloatVal;
            ? __int64 Int64Val;
            } Data;

            CDllVariable();
            CDllVariable(bool val);
            CDllVariable(INT val);
            CDllVariable(__int64 val);
            CDllVariable(LONG val);
            CDllVariable(FLOAT val);
            CDllVariable(DOUBLE val);
            CDllVariable(CHAR val);
            CDllVariable(wchar_t val);
            CDllVariable(LPCTSTR val);
            CDllVariable(VOID * val);
            };
            class CDllFunctionCall??
            {
            public:
            enum CallConvention
            {
            ? ccStdCall,
            ? ccCdecl
            };
            public:
            HRESULT Load(LPCSTR szDllPath,LPCTSTR szFuncName);
            VOID UnLoad();
            CDllVariable Invoke(std::vector<CDllVariable>& Args, CDllVariable::CDllVariableType ReturnType, CallConvention conv = ccStdCall);
            private:
            FARPROC FFuncPtr;
            HMODULE m_hDllHandle;

            public:
            CDllFunctionCall();
            virtual ~CDllFunctionCall();
            };

            ///////////////////////////////////////////////////////下面是具體代碼的實現(xiàn)


            CDllFunctionCall::CDllFunctionCall()
            {
            }
            CDllFunctionCall::~CDllFunctionCall()
            {
            }
            CDllVariable::CDllVariable(bool val)
            {
            Type=atBool;
            Data.BoolVal=val;
            }
            CDllVariable::CDllVariable( INT val )
            {
            Type = atInt;
            Data.IntVal = val;
            }
            CDllVariable::CDllVariable(LONG val)
            {
            CDllVariable(__int64(val));
            }
            CDllVariable::CDllVariable(VOID * val)
            {
            CDllVariable(INT(val));
            }
            CDllVariable::CDllVariable()
            {
            Type = atVoid;
            Data.IntVal = 0;
            }
            CDllVariable::CDllVariable( FLOAT val )
            {
            Type = atFloat;
            Data.FloatVal = val;
            }
            CDllVariable::CDllVariable( DOUBLE val )
            {
            Type = atDouble;
            Data.DoubleVal = val;
            }
            CDllVariable::CDllVariable( __int64 val )
            {
            Type = atInt64;
            Data.Int64Val = val;
            }
            CDllVariable::CDllVariable( wchar_t val )
            {
            Type = atWChar;
            Data.WCharVal = val;
            }
            CDllVariable::CDllVariable( CHAR val )
            {
            Type = atChar;
            Data.CharVal = val;
            }
            //字符串用于傳送地址進去
            CDllVariable::CDllVariable(LPCTSTR val )
            {
            Type = atInt;
            Data.IntVal =(INT)val;
            }

            HRESULT CDllFunctionCall::Load(LPCSTR szDllPath,LPCTSTR szFuncName)
            {
            m_hDllHandle=LoadLibrary(szDllPath);
            if(!m_hDllHandle || m_hDllHandle==INVALID_HANDLE_VALUE)return -1;
            FFuncPtr = GetProcAddress(m_hDllHandle,szFuncName);
            if(!FFuncPtr)return -2;
            return 0;
            }
            VOID CDllFunctionCall::UnLoad()
            {
            if(!FFuncPtr)FFuncPtr=NULL;

            if(m_hDllHandle && m_hDllHandle!=INVALID_HANDLE_VALUE)
            {
            ? FreeLibrary(m_hDllHandle);
            ? //CloseHandle(m_hDllHandle);
            ? m_hDllHandle=NULL;
            }
            }
            CDllVariable CDllFunctionCall::Invoke(std::vector<CDllVariable>& Args, CDllVariable::CDllVariableType ReturnType, CallConvention conv )
            {
            if((!m_hDllHandle || m_hDllHandle==INVALID_HANDLE_VALUE) || (!FFuncPtr)) return CDllVariable(0);

            ??
            // 用于存放8字節(jié)數(shù)據(jù)的結(jié)構(gòu)
            union LongType
            {
            ? double DoubleVal;
            ? __int64 IntVal;
            ? struct??
            ? {
            ?? int Head,Tail;
            ? } Parts;
            };

            // 使用stdcall/cdecl函數(shù)調(diào)用約定,參數(shù)從右至左壓棧
            for (int i=Args.size()-1; i>=0; i--)
            {
            ? CDllVariable var = Args;
            ? LongType l;
            ? // 將單字節(jié)數(shù)據(jù)放在4字節(jié)變量中,以便入棧
            ? int tmp = var.Data.CharVal;
            ? // 將不同類型的數(shù)據(jù)壓入堆棧
            ? switch(Args.Type)
            ? {
            ? case CDllVariable::atBool:
            ?? {
            ??? _asm push var.Data.BoolVal
            ?? }
            ?? break;
            ? case CDllVariable::atChar:? // 單字節(jié)整數(shù)
            ?? __asm
            ?? {
            ??? push tmp
            ?? };
            ?? break;
            ? case CDllVariable::atDouble: // 8字節(jié)浮點
            ?? // 8字節(jié)數(shù)據(jù)分兩部分壓入堆棧,低位先入棧
            ?? l.DoubleVal = var.Data.DoubleVal;
            ?? __asm
            ?? {
            ??? push l.Parts.Tail
            ??? push l.Parts.Head
            ?? }
            ?? break;
            ? case CDllVariable::atFloat: // 4字節(jié)浮點
            ?? __asm
            ?? {
            ??? push var.Data.FloatVal;
            ?? }
            ?? break;
            ? case CDllVariable::atInt: // 32位整數(shù)
            ?? __asm push var.Data.IntVal;
            ?? break;
            ? case CDllVariable::atWChar: // 16位整數(shù)
            ?? __asm push var.Data.WCharVal;
            ?? break;
            ? case CDllVariable::atInt64: // 64位整數(shù)
            ?? l.IntVal = var.Data.Int64Val;
            ?? __asm
            ?? {
            ??? push l.Parts.Tail
            ??? push l.Parts.Head
            ?? }
            ?? break;
            ? case CDllVariable::atVoid: // 對于函數(shù)參數(shù),void類型是非法的
            ? // throw gxException(gxString(L"Cannot pass void as an argument. (gxDllFunction::Invoke)"),__FILE__,__LINE__);
            ?? break;
            ? }
            }
            // 嵌入式匯編只能訪問函數(shù)內(nèi)部變量,故將函數(shù)指針復制一份
            FARPROC fptr = FFuncPtr;
            // 調(diào)用函數(shù),并獲得保存在EDX,EAX中的整型函數(shù)返回值
            LongType ltVal;
            int itval, ihval;
            __asm
            {
            ? call fptr
            ? mov int ptr[ihval], EDX
            ? mov int ptr[itval], EAX
            }
            ltVal.Parts.Head = ihval; // 高位字只為int64類型所使用
            ltVal.Parts.Tail = itval;

            // 將函數(shù)返回值整理到gxDllVaraiable結(jié)構(gòu)中
            CDllVariable retval;
            retval.Type = ReturnType;
            switch (ReturnType)
            {
            case CDllVariable::atChar:
            ? retval.Data.CharVal = ltVal.Parts.Tail;
            ? break;
            case CDllVariable::atDouble:
            ? // 對于浮點類型返回值,需從FPU堆棧的棧頂中讀取
            ? __asm fstp [retval.Data.DoubleVal];
            ? break;
            case CDllVariable::atFloat:
            ? // 對于浮點類型返回值,需從FPU堆棧的棧頂中讀取
            ? __asm fstp [retval.Data.FloatVal];
            ? break;
            case CDllVariable::atInt:
            ? retval.Data.IntVal = ltVal.Parts.Tail;
            ? break;
            case CDllVariable::atWChar:
            ? retval.Data.WCharVal = ltVal.Parts.Tail;
            ? break;
            case CDllVariable::atInt64:
            ? retval.Data.Int64Val = ltVal.IntVal;
            ? break;
            case CDllVariable::atVoid:
            ? break;
            }
            // 使用C/C++默認調(diào)用約定,需要由調(diào)用者彈出變量
            if (conv == ccCdecl)
            {
            ? for (int i=0; i<Args.size(); i++)
            ? {
            ?? if (Args.Type == CDllVariable::atDouble || Args.Type == CDllVariable::atInt64)
            ?? __asm
            ?? {
            ??? pop EAX
            ??? pop EAX
            ?? }
            ?? else
            ?? __asm
            ?? {
            ??? pop EAX
            ?? }
            ? }
            }
            return retval;
            }


            說明:在系統(tǒng)中加入這個接口,基本上等于實現(xiàn)了什么東西都可以調(diào)用別人的程序,不必自己實現(xiàn),根據(jù)業(yè)務的多變情況
            ???? 隨時調(diào)用相應的功能DLL即可實現(xiàn),做為程序員的明確目標:寫最少的程序!

            成人a毛片久久免费播放| 欧美久久久久久精选9999| 偷偷做久久久久网站| 久久人人爽爽爽人久久久| 狠狠久久亚洲欧美专区| 日日狠狠久久偷偷色综合免费 | 国产精品美女久久久免费| 麻豆久久| 国产AV影片久久久久久| 中文字幕日本人妻久久久免费| 91精品国产91久久综合| 一级a性色生活片久久无少妇一级婬片免费放| 久久久久波多野结衣高潮| 日韩一区二区久久久久久| 婷婷五月深深久久精品| 久久露脸国产精品| 久久亚洲国产中v天仙www| 一本色道久久88精品综合| 国产香蕉97碰碰久久人人| 国内精品久久久久伊人av| 亚洲欧美日韩久久精品第一区| 精品久久综合1区2区3区激情| www久久久天天com| 久久精品人人槡人妻人人玩AV| 亚洲七七久久精品中文国产| 精品久久久久中文字| 狠狠色丁香久久综合五月| 久久久久国产精品熟女影院| 亚洲精品无码久久久久久| 亚洲国产天堂久久综合| 理论片午午伦夜理片久久 | 久久久久亚洲AV成人网人人网站| 久久精品国产第一区二区| 亚洲伊人久久大香线蕉苏妲己| 成人综合伊人五月婷久久| 久久精品国产亚洲av麻豆小说 | 久久午夜综合久久| 亚洲欧美精品一区久久中文字幕| 精品免费久久久久国产一区| 久久久噜噜噜久久中文字幕色伊伊| 久久国产精品国语对白|