大家好,我在使用GetProcAddress()时遇到了迷惑,我下载了一个Wintech OPC开发工具包,里面含有Wtclient.dll,使用dll export viewer查看到其中一个函数为_Deactivate30MinTimer@4,从这里可以看出是使用__stdcall调用规则的,但是我看到其带有的WTclientAPI.h里面的函数原型为_declspec(dllexport) BOOL  WINAPI Disable30MinTimer (LPCSTR Authorization); ,我在VC6里面使用Regno=(pReg)GetProcAddress(hReg,"Deactivate30MinTimer"),则在使用时出错,如果这样写Regno=(pReg)GetProcAddress(hReg,"_Deactivate30MinTimer@4")就是对的,我感觉很麻烦,每次都不能直接使用诸如Deactivate30MinTimer这样的函数,而是使用类似_Deactivate30MinTimer@4这样的语句,我想问一下,有什么办法可以直接使用函数名?

解决方案 »

  1.   

    这个简单。地址复制个就好了Regno=(pReg)GetProcAddress(hReg,"_Deactivate30MinTimer@4");
    MyFun Fun1=Regno;MyFun就是_declspec(dllexport) BOOL  WINAPI Disable30MinTimer (LPCSTR Authorization);的Typedef函数指针定义然后以后拿Fun1(xxxxxx)用就行了
      

  2.   


    如果看到其带有的WTclientAPI.h,说明可能有LIB文件,你可以把.LIB和.H的文件包含到工程中就可以直接按常规的函数调用方式使用函数了.
      

  3.   

    确实有LIB文件,可是我看到WTclientAPI.h里面的定义是导出函数啊,并没有定义导入函数啊,如果我在程序里要使用,是不是使用隐式连接,要是这样的话,是不是还要自己写一个导入头文件,这样的话工作量不是非常的大吗? WTclientAPI.h 部分定义如下:
    #ifdef __cplusplus
    extern "C" {
    #endif  /* __cplusplus */
    _declspec(dllexport) BOOL  WINAPI Disable30MinTimer (LPCSTR Authorization);
    #ifdef __cplusplus
    }#endif
      

  4.   

    可是我看到WTclientAPI.h里面的定义是导出函数啊
    ==========
    改一下不就行了。
      

  5.   

    我上面只是写了一个,里面有上百个,这样替换工作量也很大,同时我看了WIN32程序设计, Charles Petzold在测试程序中并没有对xxx.h头文件进行__declspec(dllimport)定义,而是直接使用了带有__declspec(dllexport)的头文件,仍能正常工作,这说明,进行隐式链接时,并不需要在项目中使用dllimport定义将要使用DLL中的输出函数,只要包含函数原型即可,不管其前面用什么修饰符。
      

  6.   

    确实是这样的,但是声明前要加extern表示函数实现在外部
      

  7.   

    在def文件中写明显式导出函数名称Disable30MinTimer 
      

  8.   


    原先我也以为这样可以,但是后来的程序中出现错误,才不得不重新重视这个问题.如果不对DLL中导出的函数加__declspec(dllimport)修饰,会产生一些内存错误.在类的导出时,这个问题更为严重.
    所以,虽然可以运行,但为了安全起见,还是加上__declspec(dllimport)修饰符号.