HI,
我创建了一个dll,定义了下面这样的一个函数
extern "C" int __declspec(dllexport) __stdcall MyFunc()然后在调用者中通过LoadLibrary动态加载dll,在查找函数的时候,通过GetProcAddress(hinst,"MyFunc")查找,总是找不到。通过dumpbin dll,发现导出函数名被修饰了,变为如下:
ordinal hint RVA      name
 1    0 000110C8 _MyFunc@0 = @ILT+195(_MyFunc@0)
1.如果是按照教程上说的,extern "C"不是限定符号编译时不加修饰符么?
2.如果去掉__stdcall,则extern "C"确实是不加修饰符的。这么说,__stdcall和extern "C"不能共存的么?
我看到别人提供的dll,对应的头文件函数说明也是标明是stdcall,同时我们在访问函数的时候,也是正常使用MyFunc,并没有其他的修饰符,请问这个是怎么做到的呀?

解决方案 »

  1.   

    Help~~~~~~~~~~~~~~~~~~~~~~~
      

  2.   

    加个 .def 模块定义文件
      

  3.   

    c默认是__cdecl 调用约定;
    API函数都是 __stdcall 调用约定;
    不同的调用约定对于怎么入栈,有谁平衡堆栈都不一样;
    extern "C" 可以防止C++的名字改编
      

  4.   

    ++
    调用约定也会影响名字改编,最好用.def文件
      

  5.   

    __stdcall convention是下划线+name@参数大小和
    影响dll的导出函数名
    __cdecl convention的dll的导出函数名才跟代码中一致
      

  6.   

    官方原文如下:
    extern "C" merely ensures that the symbol is compatible with C code. __cdecl and __stdcall are separate directives that can be applied to fully decorated c++ functions
    解决办法有二种:
    1、Export as extern "C" ensuring that the __cdecl calling convention is used
    2、Export via a .DEF file
      

  7.   

    extern "C" __declspec( dllexport ) int MyFunc()
      

  8.   

    _stdcall 又改过来了
    所以 还是用def 安全 
      

  9.   

    无论使用
    def文件
    还是用
    extern "C" __declspec( dllexport ) int MyFunc()
    搞明白就行。。
      

  10.   

    Dll文件包含个Dll.def文件格式如下:
    LIBRARY DllTest
    EXPORTS
    函数名1 
    函数名2