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工作正常,但会弹出两次窗口。我单击忽略它。

(来源:)

  • 为什么F4根本不起作用?这引发了一个例外 编辑:
    问题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
    会刷新),因此会发生以下情况:

  • F1被调用,
    “它工作\n”
    被写入DLL的libc++标准内存缓冲区
  • 调用F2,并将
    154827\n
    写入可执行文件的libc++标准内存缓冲区。调用
    std::endl
    将刷新该缓冲区并将其打印到控制台
  • F3被调用,
    “它工作:1515\n”
    被写入DLL的libc++标准内存缓冲区
  • F4被调用,
    13
    被写入可执行文件的libc++stdout内存缓冲区。调用
    std::endl
    将刷新该缓冲区并将其打印到控制台
  • 进程退出,导致DLL卸载。作为其清理例程的一部分,libc++刷新其输出缓冲区,导致
    “它工作\n它工作:1515\n”
    打印到控制台
  • <>这是为了确保在DLL和可执行文件中使用相同的C++(和C)运行库。请参阅以了解有关该版本的详细信息,我建议对可执行文件和DLL使用多线程版本DLL(
    /MD
    编译器选项)


    <>也可以。

    可能发生的是,你的DLL和你的可执行文件链接到C++运行库的不同版本。由于现在存在两个不同版本的C++运行库,它们都存在于进程的地址空间中,因此有两个单独的内存缓冲区用于STDUT。由于不是在DLL函数中刷新数据,而是在可执行文件中刷新数据(请注意,打印新行
    '\n'
    不会刷新,但打印
    std::endl
    会刷新),因此会发生以下情况:

  • F1被调用,
    “它工作\n”
    被写入DLL的libc++标准内存缓冲区
  • 调用F2,并将
    154827\n
    写入可执行文件的libc++标准内存缓冲区。调用
    std::endl
    将刷新该缓冲区并将其打印到控制台
  • F3被调用,
    “它工作:1515\n”
    被写入DLL的libc++标准内存缓冲区
  • F4被调用,
    13
    被写入可执行文件的libc++stdout内存缓冲区。调用
    std::endl
    将刷新该缓冲区并将其打印到控制台
  • 进程退出,导致DLL卸载。作为其清理例程的一部分,libc++刷新其输出缓冲区,导致
    “它工作\n它工作:1515\n”
    打印到控制台
  • <>这是为了确保在DLL和可执行文件中使用相同的C++(和C)运行库。请参阅以了解有关该版本的详细信息,我建议对可执行文件和DLL使用多线程版本DLL(
    /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);