青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Codejie's C++ Space

Using C++

練習(xí):LoadLibrary調(diào)用DLL中的Class

    使用LoadLibrary函數(shù)調(diào)用DLL中的函數(shù)的方法一般被稱為“顯式”調(diào)用,意義和使用lib的“隱式”調(diào)用相對(duì)應(yīng)。
    LoadLibrary調(diào)用DLL中的函數(shù)的方法比較簡單,通過GetProcAddress獲得函數(shù)的在DLL的地址就可以訪問了,但DLL中的Class訪問就相對(duì)很復(fù)雜了(目前我就發(fā)現(xiàn)這一種顯式調(diào)用方式,哪位有其他方法么?)。一個(gè)簡單的情況就是Class的函數(shù)在調(diào)用是,其名稱是什么?還有Class的contructor函數(shù)怎么調(diào)用?下面的代碼將演示下這些問題。
這里是DLL的文件:
    DllMain.h

 1#ifndef __DLLMAIN_H__
 2#define __DLLMAIN_H__
 3
 4#include <string>
 5
 6#define DllExport __declspec(dllexport)
 7
 8extern "C" int DllExport Func(int x);
 9
10extern "C" class DllExport CA
11{
12public:
13    CA(int x);
14    ~CA();
15
16    int Func0();
17    int Func(int x);
18    const std::string& FuncS(int x, const std::string& str) const;
19protected:
20    int _x;
21}
;
22
23
24#endif

    DllMain.cpp
 1#include <iostream>
 2
 3#include "DllMain.h"
 4
 5int Func(int x)
 6{
 7    return x * 10;
 8}

 9
10CA::CA(int x)
11   : _x(x)
12{
13    std::cout << "contructor" << std::endl;
14}

15
16CA::~CA()
17{
18    std::cout << "destructor" << std::endl;
19}

20
21int CA::Func0()
22{
23    return _x;
24}

25
26int CA::Func(int x)
27{
28    return _x * x;
29}

30
31const std::string& CA::FuncS(int x, const std::string &str) const
32{
33    return str;
34}

35

    這里需要.def文件了,因?yàn)镃lass在DLL中的命名不像函數(shù)命名那么簡單,會(huì)被轉(zhuǎn)義的,像CA::Func(int)在DLL的export表中就是?Func@CA@@QAEHH@Z,具體定義說明可參看《xxx的自我修養(yǎng)》一書。因此,這里需要使用.def文件對(duì)函數(shù)進(jìn)行重命名,下面是DllMain.def文件內(nèi)容:
 
1LIBRARY TESTDLL
2EXPORTS
3    Func = Func
4    CA::CA(int= ??0CA@@QAE@H@Z
5    CA::~CA = ??1CA@@QAE@XZ
6    CA::Func0 = ?Func0@CA@@QAEHXZ
7    CA::Func(int= ?Func@CA@@QAEHH@Z
8    ;CA::FuncS(int,std::basic_string<char>&= ?FuncS@CA@@QBEABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@HABV23@@Z
9    CA::FuncS = ?FuncS@CA@@QBEABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@HABV23@@Z


    多說一句,這里.def的編寫很需要Depends(Dependency Walker)工具的支持,其是查看DLL的首選工具啊。。


    編譯DLL,用下面代碼進(jìn)行測試:
    LoadLib.cpp
 1#include <iostream>
 2#include <string>
 3
 4#include <windows.h>
 5
 6//#include "DllMain.h"
 7
 8#define DllExport __declspec(dllexport)
 9
10extern "C" int DllExport Func(int x);
11
12extern "C" class DllExport CA
13{
14public:
15    CA(int x);
16    ~CA();
17
18    int Func0();
19    int Func(int x);
20    const std::string& FuncS(int x, const std::string& str) const;
21
22private:
23    int _x;
24}
;
25
26typedef int (*func)(int);
27typedef void (WINAPI *PCTOR)(int);
28typedef int (WINAPI *func0)(void);
29typedef int (WINAPI *funcc)(int);
30typedef const std::string& (WINAPI *funcs)(int,const std::string&);
31typedef void (WINAPI *PDTOR)(void);
32
33int main()
34{
35    HINSTANCE hdll;
36    hdll = LoadLibraryA(("../DLLTEST/Debug/DLLTEST.dll"));
37    if(hdll != NULL)
38    {
39        func pf = (func)GetProcAddress(hdll, "Func");
40        std::cout << pf(10<< std::endl;
41        CA* a = (CA*)malloc(sizeof(CA));
42        PCTOR pc = (PCTOR)GetProcAddress(hdll, "CA::CA(int)");
43        _asm { MOV ECX, a } 
44        pc(5);
45        func0 pf0 = (func0)GetProcAddress(hdll, "CA::Func0");
46        _asm {MOV ECX, a }
47        std::cout << pf0() << std::endl;
48        funcc pfc = (funcc)GetProcAddress(hdll, "CA::Func(int)");
49        _asm { MOV ECX, a }
50        std::cout << pfc(10<< std::endl;
51        funcs pfs = (funcs)GetProcAddress(hdll, "CA::FuncS");
52        _asm { MOV ECX, a }
53        std::cout << pfs(0, std::string("hello world")) << std::endl;
54        PDTOR pd = (PDTOR)GetProcAddress(hdll, "CA::~CA");
55        _asm { MOV ECX, a } 
56        pd();        
57        free(a);    
58    }

59    FreeLibrary(hdll);
60    
61    return 0;
62}


    結(jié)果還算正常:
1100
2contructor
35
450
5hello world
6destructor
7


    上面的代碼基本演示了DLL中Class的簡單使用,包括對(duì)contructor、destrunctor的調(diào)用,有參、無參、多參函數(shù)調(diào)用,不知道有啥缺陷,但至少Work了,嘿嘿~
    由上述代碼可以看出,這種“顯式”使用DLL中的Class是非常繁瑣和危險(xiǎn)的事情,因此我覺得能用“隱式”就不要用“顯式”,能靜態(tài)就不要用動(dòng)態(tài)。。。
    注意到?jīng)],代碼沒有演示繼承和虛函數(shù),那是因此我加入Virtual函數(shù),程序就會(huì)core,實(shí)在搞不定,這里也就沒法給出好的方案來,不知道哪位有啥建議么。。。
    上面代碼參考了如下地址:
          http://www.codeproject.com/dll/classesexportedusingLL.asp
          http://blog.csdn.net/jdcb2001/archive/2006/11/21/1401569.aspx

posted on 2009-09-24 17:50 codejie 閱讀(25508) 評(píng)論(8)  編輯 收藏 引用 所屬分類: C++

評(píng)論

# re: 練習(xí):LoadLibrary調(diào)用DLL中的Class[未登錄] 2009-09-25 01:17 Liu

最近很高產(chǎn)么,看來在M記沒事可干阿

繼續(xù)寫,我也學(xué)習(xí)學(xué)習(xí)  回復(fù)  更多評(píng)論   

# re: 練習(xí):LoadLibrary調(diào)用DLL中的Class 2009-09-25 09:59 陳梓瀚(vczh)

鑒于復(fù)雜參數(shù)的計(jì)算也有可能會(huì)毀掉ecx,而且你又不能再參數(shù)放進(jìn)去之后再修改ecx,所以你還是老老實(shí)實(shí)import一個(gè)完整的類吧……  回復(fù)  更多評(píng)論   

# re: 練習(xí):LoadLibrary調(diào)用DLL中的Class 2009-09-25 11:43 codejie

@Liu
M記現(xiàn)在還沒有想起讓我做什么,我也是吃了空,想到啥就寫點(diǎn)啥,沒目的,估計(jì)也‘產(chǎn)’不出什么。。。別學(xué)了,省的耽誤了你老人家~
另,我在看你A國的代碼,那叫一個(gè)慘啊,怎么也想不明白,號(hào)稱‘技術(shù)領(lǐng)先’的A國人,怎么會(huì)寫出這樣的代碼。。。  回復(fù)  更多評(píng)論   

# re: 練習(xí):LoadLibrary調(diào)用DLL中的Class 2009-09-25 11:46 codejie

@陳梓瀚(vczh)
我也知道這種方式不好,至少virtual我還沒有搞定。你說的使用import方式該如何做?能給給實(shí)例不?我現(xiàn)在想解決的問題就是,如果只有DLL,沒有l(wèi)ib的情況下,如何使用‘顯式’方式訪問DLL中的Class。  回復(fù)  更多評(píng)論   

# re: 練習(xí):LoadLibrary調(diào)用DLL中的Class 2009-09-25 15:47 溪流

@codejie

只有 DLL(如果不知道函數(shù)名,即不給出 .def),同樣不能“顯式”調(diào)用 DLL 中的函數(shù),不是嗎?
不過同樣可以用你上面的工具找出函數(shù)名稱,然后 GetProcAddress,然后使用……  回復(fù)  更多評(píng)論   

# re: 練習(xí):LoadLibrary調(diào)用DLL中的Class 2009-09-25 17:10 codejie

@溪流
不知道exports函數(shù)名的情況下使用DLL是一種比較極端的情況,不光是函數(shù)名稱不知道,函數(shù)的參數(shù)更是一個(gè)問題,.def中多數(shù)不說明參數(shù)的。
這里使用LoadLibrary的‘顯式’調(diào)用,一般應(yīng)該多數(shù)用于實(shí)時(shí)加載DLL,而不是程序啟動(dòng)就加載DLL,這樣作便于管理程序的內(nèi)存使用情況,記得在早期的windows16位機(jī)器上常用,還有就是利用DLL特性做plugins的程序中。
這里的代碼只是我吃了空而突發(fā)奇想的,跟你說的一樣,現(xiàn)實(shí)中應(yīng)該很少用的。  回復(fù)  更多評(píng)論   

# re: 練習(xí):LoadLibrary調(diào)用DLL中的Class 2012-07-17 09:14 Richard Wei

如果要用顯試調(diào)用類,建議還是用接口方式吧,導(dǎo)出一個(gè)CreateInstance(interface** ppInterface)就可以了,簡單又方便,具體參考COM  回復(fù)  更多評(píng)論   

# re: 練習(xí):LoadLibrary調(diào)用DLL中的Class 2012-07-17 09:43 codejie

@Richard Wei
神奇的COM, 龐大的COM, 恐怖的COM。。。  回復(fù)  更多評(píng)論   

公告

Using C++

導(dǎo)航

統(tǒng)計(jì)

留言簿(73)

隨筆分類(513)

積分與排名

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲精品国产无天堂网2021| 亚洲一区二区网站| 久久免费99精品久久久久久| 欧美在线播放一区| 亚洲国产成人av在线| 亚洲国产人成综合网站| 欧美福利视频在线| 亚洲香蕉网站| 香蕉尹人综合在线观看| 亚洲福利视频网站| 一本色道久久综合亚洲精品婷婷| 国产精品爽黄69| 媚黑女一区二区| 欧美母乳在线| 久久久久久一区二区| 欧美成人综合一区| 久久精品91| 欧美日韩高清在线| 久久久久久久久一区二区| 欧美成人按摩| 欧美在线影院| 欧美精品国产精品| 久久免费视频这里只有精品| 欧美日韩亚洲一区二区三区四区| 久久激情视频久久| 欧美精品在线观看| 麻豆国产精品va在线观看不卡| 欧美日韩国产精品一区| 久久久99精品免费观看不卡| 欧美久久久久久久| 久久最新视频| 国产女人aaa级久久久级| 亚洲黄色天堂| 黄色成人小视频| 亚洲伊人色欲综合网| 日韩视频在线观看免费| 久久精品一二三区| 久久国产加勒比精品无码| 欧美日韩不卡| 亚洲国产网站| 亚洲国产日韩欧美综合久久| 亚洲欧美日韩国产一区二区| 制服丝袜激情欧洲亚洲| 免费久久99精品国产| 国产美女高潮久久白浆| 91久久一区二区| 久久本道综合色狠狠五月| 99国产精品99久久久久久粉嫩| 久久久久久久91| 久久精品国产久精国产一老狼| 欧美日韩不卡视频| 亚洲黄色高清| 亚洲黄色性网站| 久久精品一区二区三区四区| 欧美一区二区三区四区在线观看地址| 欧美日韩亚洲一区二区三区| 亚洲黄色在线观看| 亚洲美女视频在线免费观看| 老司机免费视频一区二区| 久久综合九色99| 激情欧美一区二区三区| 久久精彩免费视频| 久久理论片午夜琪琪电影网| 国语自产偷拍精品视频偷 | 亚洲一区成人| 欧美亚一区二区| 亚洲视频一区二区免费在线观看| 亚洲天堂男人| 国产精品午夜在线观看| 午夜精品一区二区三区在线| 久久久久久伊人| 亚洲国产美女| 欧美日韩国产片| 亚洲天堂免费观看| 久久精品视频免费| 91久久精品国产91性色| 欧美精品二区| 中文在线不卡| 久久男人av资源网站| 亚洲国产福利在线| 欧美连裤袜在线视频| 亚洲一区综合| 欧美成人精品三级在线观看| 日韩视频免费观看高清在线视频| 欧美视频一区二区三区| 亚欧美中日韩视频| 欧美激情第六页| 亚洲网站在线看| 国产一区二区高清| 欧美精品1区| 亚洲影院色无极综合| 模特精品裸拍一区| 亚洲欧美www| 亚洲国产天堂久久国产91| 欧美日韩综合| 久久久久高清| 亚洲午夜电影网| 免费成人激情视频| 亚洲欧美日本国产有色| 在线观看日韩国产| 欧美性猛交一区二区三区精品| 久久精彩免费视频| 一区二区三区欧美在线| 蜜臀av性久久久久蜜臀aⅴ四虎| 夜夜嗨av一区二区三区中文字幕| 国产欧美一区二区三区另类精品 | 国产色婷婷国产综合在线理论片a| 久久青青草原一区二区| 久久精品综合一区| 91久久精品国产91久久性色| 久久精品国产亚洲aⅴ| 99视频在线观看一区三区| 国产视频久久| 国产精品s色| 欧美激情欧美狂野欧美精品| 午夜欧美理论片| 99精品国产福利在线观看免费| 欧美xxx成人| 久久久女女女女999久久| 亚洲一区在线免费观看| 亚洲久久成人| 亚洲欧洲在线免费| 在线国产亚洲欧美| 狠狠狠色丁香婷婷综合久久五月 | 欧美手机在线视频| 老司机67194精品线观看| 欧美在线网站| 西西人体一区二区| 亚洲图片你懂的| 一区二区精品国产| 999亚洲国产精| 99国产精品久久久久久久久久| 亚洲国产成人精品女人久久久| 欧美a一区二区| 欧美成人精品激情在线观看| 免播放器亚洲一区| 美女性感视频久久久| 久久夜色精品国产欧美乱| 久久精品亚洲一区二区| 久久精品99国产精品酒店日本| 性做久久久久久| 欧美一级免费视频| 久久精品一本久久99精品| 久久久xxx| 欧美成人一区二免费视频软件| 免费在线亚洲欧美| 亚洲国产高清在线| 亚洲美女在线看| 一区二区三区.www| 亚洲制服少妇| 久久精品国产在热久久| 久久综合九色| 欧美精品三级| 国产精品爱久久久久久久| 国产精品久久久久影院色老大| 国产美女精品视频免费观看| 国产亚洲永久域名| 亚洲第一福利视频| 在线视频一区二区| 亚洲欧美一级二级三级| 久久久久久久精| 欧美国产亚洲视频| 一本综合精品| 欧美在线看片a免费观看| 美女脱光内衣内裤视频久久影院| 欧美日本在线看| 国产伦精品一区二区三区免费| 在线观看日韩av| 亚洲永久精品国产| 美女爽到呻吟久久久久| 亚洲精品资源美女情侣酒店| 亚洲永久免费av| 免费一区二区三区| 国产精品一区亚洲| 亚洲国产视频直播| 欧美一区二区黄色| 亚洲区一区二| 久久激情综合| 国产精品久久久久久久app| 亚洲电影免费在线| 亚洲一级在线| 欧美大片va欧美在线播放| aa成人免费视频| 久久久亚洲一区| 国产精品区二区三区日本| 亚洲精品久久久久久久久| 久久成人免费日本黄色| 亚洲伦伦在线| 蜜桃av久久久亚洲精品| 午夜日韩av| 亚洲高清在线视频| 欧美一区网站| 欧美特黄一级| 亚洲精品亚洲人成人网| 久久亚洲春色中文字幕| 亚洲一区二区三区四区五区黄 | 一区二区国产精品| 欧美激情精品久久久久久久变态| 黄色一区三区| 欧美中文字幕在线|