C++ 尝试使用DLL中的函数时出错
我的代码: 动态链接库: 问题:C++ 尝试使用DLL中的函数时出错,c++,visual-c++-6,C++,Visual C++ 6,我的代码: 动态链接库: 问题: 1.为什么F1显示在F2之后?F1在F2之前调用。 2.F3工作正常,但会弹出两次窗口。我单击忽略它。 (来源:) 为什么F4根本不起作用?这引发了一个例外 编辑: 问题2和3现在已经解决了 对于1,现在的输出是: Library loaded: 154827 13 It works It works: 1515 顺序是:F2、F4、F1、F3。 我叫他们:F1、F2、F3、F4。 为什么会发生这种情况?看起来您的呼叫约定是错误的。尝试将
1.为什么F1显示在F2之后?F1在F2之前调用。
2.F3工作正常,但会弹出两次窗口。我单击忽略它。
(来源:)
问题2和3现在已经解决了 对于1,现在的输出是:
Library loaded:
154827
13
It works
It works: 1515
顺序是:F2、F4、F1、F3。我叫他们:F1、F2、F3、F4。
为什么会发生这种情况?看起来您的呼叫约定是错误的。尝试将
WINAPI
(即\uu stdcall
)更改为\uu cdecl
typedef void (__cdecl *f1)();
typedef int (__cdecl *f2)();
typedef void (__cdecl *f3)(int);
typedef int (__cdecl *f4)(int);
看来你打错电话了。尝试将
WINAPI
(即\uu stdcall
)更改为\uu cdecl
typedef void (__cdecl *f1)();
typedef int (__cdecl *f2)();
typedef void (__cdecl *f3)(int);
typedef int (__cdecl *f4)(int);
<> P>可能发生的是,您的DLL和可执行文件链接到C++运行库的不同版本。由于现在存在两个不同版本的C++运行库,它们都存在于进程的地址空间中,因此有两个单独的内存缓冲区用于STDUT。由于不是在DLL函数中刷新数据,而是在可执行文件中刷新数据(请注意,打印新行
'\n'
不会刷新,但打印std::endl
会刷新),因此会发生以下情况:
“它工作\n”
被写入DLL的libc++标准内存缓冲区154827\n
写入可执行文件的libc++标准内存缓冲区。调用std::endl
将刷新该缓冲区并将其打印到控制台“它工作:1515\n”
被写入DLL的libc++标准内存缓冲区13
被写入可执行文件的libc++stdout内存缓冲区。调用std::endl
将刷新该缓冲区并将其打印到控制台“它工作\n它工作:1515\n”
打印到控制台/MD
编译器选项)
<>也可以。可能发生的是,你的DLL和你的可执行文件链接到C++运行库的不同版本。由于现在存在两个不同版本的C++运行库,它们都存在于进程的地址空间中,因此有两个单独的内存缓冲区用于STDUT。由于不是在DLL函数中刷新数据,而是在可执行文件中刷新数据(请注意,打印新行
'\n'
不会刷新,但打印std::endl
会刷新),因此会发生以下情况:
“它工作\n”
被写入DLL的libc++标准内存缓冲区154827\n
写入可执行文件的libc++标准内存缓冲区。调用std::endl
将刷新该缓冲区并将其打印到控制台“它工作:1515\n”
被写入DLL的libc++标准内存缓冲区13
被写入可执行文件的libc++stdout内存缓冲区。调用std::endl
将刷新该缓冲区并将其打印到控制台“它工作\n它工作:1515\n”
打印到控制台/MD
编译器选项)
另见
Library loaded:
154827
13
It works
It works: 1515
typedef void (__cdecl *f1)();
typedef int (__cdecl *f2)();
typedef void (__cdecl *f3)(int);
typedef int (__cdecl *f4)(int);