none
dll引用 RRS feed

  • 问题

  • 看了别人的几个dll,在程序中引用都是如下

            int(__stdcall*  add)(int a,int b);
            HINSTANCE gInst= LoadLibraryA("测试1.0.dll");
            if(NULL == gInst)
            {
                return 0;
            }
            add = (int  (__stdcall *)(int a,int b))GetProcAddress(gInst, "add");

    在dll中,我如下定义int _stdcall add(int a,int b)

    运行的时候总是报错,要想这样引用函数,那么在dll中要怎么定义呢

     

    2011年7月28日 1:47

答案

  •  __declspec(dllexport) int _stdcall add(int a,int b)


    麻烦把正确答案设为解答。
    2011年7月28日 2:04
    版主
  • 结果是一样的不行
    2011年7月28日 4:55
  • 找到原因了,我用工具一看,函数名竟然和代码不一样,看下我声明的函数名:

    _declspec(dllexport) int _stdcall AddExport(int a,int b)
    {
        return a+b;
    }

    引用代码:

    addFun = (lpAddFun)GetProcAddress(hDll,"?AddExport@@YGHHH@Z");   

    这个函数名就通了,我不明白怎么这个名字会变了呢

    2011年7月28日 8:28
  • 要用extern "C"

    C++语言支持函数重载,C 语言不支持函数重载。函数被 C++编译后在库中的名
    字与 C 语言的不同。假设某个函数的原型为:  void foo(int x, int y);
    该函数被 C 编译器编译后在库中的名字为 _foo,而 C++编译器则会产生像
    _foo_int_int 之类的名字。
    C++提供了 C 连接交换指定符号 extern“C”来解决名字匹配问题。

    2011年7月29日 0:27

全部回复

  •  __declspec(dllexport) int _stdcall add(int a,int b)


    麻烦把正确答案设为解答。
    2011年7月28日 2:04
    版主
  • 结果是一样的不行
    2011年7月28日 4:55
  • typedef int (__stdcall* pFUN)(int a, int b);

    HMODULE hDll = (HMODULE)LoadLibrary(...);

    pFun add = GetProcAddress(hDll, "add");
    if(add)
    {
       add(1, 2);
    }

    ...
    FreeLibrary();

    当然您的dll中要导出这个函数名为add的函数。


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.
    2011年7月28日 4:57
    版主
  • 找到原因了,我用工具一看,函数名竟然和代码不一样,看下我声明的函数名:

    _declspec(dllexport) int _stdcall AddExport(int a,int b)
    {
        return a+b;
    }

    引用代码:

    addFun = (lpAddFun)GetProcAddress(hDll,"?AddExport@@YGHHH@Z");   

    这个函数名就通了,我不明白怎么这个名字会变了呢

    2011年7月28日 8:28
  • 要用extern "C"

    C++语言支持函数重载,C 语言不支持函数重载。函数被 C++编译后在库中的名
    字与 C 语言的不同。假设某个函数的原型为:  void foo(int x, int y);
    该函数被 C 编译器编译后在库中的名字为 _foo,而 C++编译器则会产生像
    _foo_int_int 之类的名字。
    C++提供了 C 连接交换指定符号 extern“C”来解决名字匹配问题。

    2011年7月29日 0:27