我导出用:
extern "C" void __declspec(dllexport) __stdcall function ();
导入用:
void (__stdcall* func) (void);
func = (void (__stdcall*) (void)) GetProcAddress (hDll, "function");
使用 gcc 的 objdump 工具可以看到 dll 导出列表中有 function, 但导入时
func 为空, 请教正确的做法该如何导入导出.

解决方案 »

  1.   

    我是这样做的
    BOOL  __declspec(dllexport)   __stdcall CreateTalkDlg(HWND  hParentWnd)
    {
    }
    在 dll工程 def文件中 添加 free调用者
    typedef  BOOL   __declspec(dllimport) (__stdcall CreateTalkDlg_Pro)(HWND   hParentWnd);
    extern   CreateTalkDlg_Pro  CreateTalkDlg;
      

  2.   

    回楼主:
    导出
    extern "C" void __declspec(dllexport) __stdcall function ();
    改为
    extern "C" void __declspec(dllexport) function ();
    已测试,行的。为什么我也还没搞懂。
      

  3.   

    LoadLibrary(....);
    Get.....Adress
      

  4.   

    两种解决方法:
    1.将函数据定义成__cdecl(C/C++缺省)
    2.在项目中加一def文件,内容为
    LIBRARY      "你的DLL工程名称"
    DESCRIPTION  '随便,如testdll Windows Dynamic Link Library'
    EXPORTS
    StartLDGis  @1
    并且,你要检查Project|Settings设置,确保有“/def:".\testdll.def"”这么一句。如果在.def里登记了函数名,你就不得不将__declspec(dllexport)去掉。def文件在项目中新增参见msdn帮助:ms-help://MS.MSDNQTR.2003FEB.2052/vccore/html/_core_.2f.DEF.htm所以楼主只要这样就行:
    extern "C" void __declspec(dllexport) __stdcall function ();
    改为
    extern "C" void __declspec(dllexport) _cdecl function ();
      

  5.   

    因为_stdcall函数在编译时会重新命名
    __stdcall 细节
    __stdcall 函数的参数被从右到左推送到堆栈上,被调用函数在返回之前从堆栈中弹出这些参数。对于 C,__stdcall 命名约定使用以下划线 ( _ ) 开头的函数名,后跟“at”符 (@) 和函数参数大小(以字节为单位)。不执行任何大小写转换。编译器使用下列命名约定模板:_functionname@number
      

  6.   

    建议用def文件,简单并一定正确。
      

  7.   

    大家都没弄明白我所提出的问题, 我要问的是:   如何在DLL中导入导出 __stdcall 类型的函数
      

  8.   

    to lz :用def文件不可以吗.
      

  9.   

    def 文件导出函数。
    你使用Dll的地方是使用你的头文件和lib呀。直接#include 你的dll的头文件就可以了呀。用def文件就用不着什么 __declspec(dllexport)  __declspec(dllimport) 这些关键词了。直接去掉就行了。
      

  10.   

    开来大家都不知道, 算了, 我自己去查 MSDN 好了, 结帖了.