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,并没有其他的修饰符,请问这个是怎么做到的呀?
我创建了一个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,并没有其他的修饰符,请问这个是怎么做到的呀?
解决方案 »
- 下面的情况该不该用虚拟列表~~
- FindwindowEx的问题
- vc++6.0补丁sp6的安装问题
- 如何将一个控件 以高亮 或者 灰色显示
- ListCtrl中如何将所有列都删掉,包括表头字段名?
- csocket:如何取得发送端使用的端口号,菜鸟求助????????
- 如何用VC编写代码以便在SQL中存储图片(JPG或GIF、BMP格式),有相关的书籍吗?
- 日期问题,简单
- 使用 CSplitterWnd class 创建一个分割窗口时,可以往其中一个窗口上放控件么?
- ASSERT(m_pWndCtrl->m_hWnd == NULL); // Window already attached?怎么来的?
- 关于CBUTTON重绘
- 有什么比较好的通用的压缩算法
API函数都是 __stdcall 调用约定;
不同的调用约定对于怎么入栈,有谁平衡堆栈都不一样;
extern "C" 可以防止C++的名字改编
调用约定也会影响名字改编,最好用.def文件
影响dll的导出函数名
__cdecl convention的dll的导出函数名才跟代码中一致
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
所以 还是用def 安全
def文件
还是用
extern "C" __declspec( dllexport ) int MyFunc()
搞明白就行。。
LIBRARY DllTest
EXPORTS
函数名1
函数名2