这是调用dll的代码:HINSTANCE hInst;
hInst = LoadLibrary("C:\\Documents and Settings\\Administrator\\桌面\\dll\\keyboard2\\Debug\\keyboard2.dll");
typedef HHOOK (*ADDPROC)();
ADDPROC start = (ADDPROC)GetProcAddress(hInst,"Start");
if(!start)
{
AfxMessageBox("获取函数地址失败!");
return ;
}
start();dll中,声明了一个类,类中有构造函数、析钩、Start(),Stop()函数
我想在程序中动态调用Start函数可这样执行,老是提示“获取函数地址失败”请大家帮忙,谢谢

解决方案 »

  1.   

    http://topic.csdn.net/t/20040816/17/3279822.html
      

  2.   

    定义一个纯抽象基类,就是除了纯虚函数没有别的东西的类。写在一份.H文件里。在DLL里,从在抽象基类派生子类,重载并实现基类里所有函数。并且用.DEF输出一个函数,类似于:   
        
      class   CMyClassInDll   :   public   IMyClassInDll   
      {   
              ......   
      };   
        
      LPVOID   PASCAL   CreateObject()   
      {   
              return   (LPVOID)   new   CMyClassInDll;   
      }   
        
      然后在要调用该DLL的模块里也include那个抽象基类的头文件,然后定义一个该抽象基类的指针:   
        
      IMyClassInDll   *pObj;   
        
      加载DLL,获得从DEF里输出那个函数CreateObject(),怎么获得不说了,是一般方法了。   
      然后:   pObj   =   (IMyClassInDll   *)CreateObj();   
        
      OK啦,现在你可以通过   pObj->来使用CMyClassInDll类啦!最后要注意的是,好像用完后,   
      delete   pObj会出错?我不清楚。反正你在IMyClassInDll里声明一个类似Release的函数,在该函数里delete   this就成了!   
        
      这实际就是COM(至少是进程内组件)的C++实现的理论基础。是一个最简化版本的COM组件。
      

  3.   

    为什么要定义纯抽象基类呢?在调用程序直接定义一个所要类的对象指针,然后通过CreateObj获得不可以吗?