微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

declspec和stdcall与仅declspec

如何解决declspec和stdcall与仅declspec

| 我是C ++ dll导入主题的新手,可能是我的问题很简单,但我在Google上找不到它。 我有一个非常简单的C ++ win32 dll:
#include <iostream>

using namespace std;

extern \"C\"
{
    __declspec(dllexport) void __stdcall displayHellowFromDLL()
    {
        cout<<\"Hi\"<<endl;
    }
}
当我从C#调用方法时,我没有任何问题,这是C#代码
namespace UnmanagedTester
{
    class Program
    {
        [DllImport(@\"C:\\CGlobalDll\")]
        public static extern void displayHellowFromDLL();

        static void Main(string[] args)
            {
                Console.WriteLine(\"This is C# program\");
                displayHellowFromDLL();
            }
        }
    }
如我预期的那样,输出为:\“ This is C#program \” \“ Hi \”。 现在,如果我将C函数的声明更改为:
__declspec(dllexport) void displayHellowFromDLL()
没有__stdcall,我也没有任何问题,问题是: 我何时真正需要__declspec(dllexport)TYPE __stdcall?何时只能使用__declspec(dllexport)TYPE? 非常感谢。     

解决方法

        如果使用其他约定编译调用代码,则需要指定调用约定。否则,默认设置将起作用。     ,        您可以这样想: “ 3”将您的函数声明为DLL导出的公共函数; “ 4”是一个相当底层的细节,它指的是该函数采用的“调用约定”。具体地说,“ 4”表示被叫方清理堆栈; 代替
__stdcall
的是
__cdecl
,这意味着:调用方清理堆栈。 “ 7”是\“ natural \” C调用约定;它支持vararg函数的定义(如printf)。
__stdcall
是DLL函数的默认调用约定,因此,如果仅打算通过它们的DLL API调用这些函数,则无需指定它。 这应该可以解释您正在观察的内容。     ,        由于该函数不接受任何参数,因此它偶然起作用。在具有参数的函数上执行此操作后,您将开始运气不足。调用将使堆栈不平衡,非常不健康。调试时,您会收到pInvokeStackImbalance MDA警告。否则,不平衡的堆栈可能会在一段时间内不被注意,这可能会使您的程序在Release版本中崩溃。     ,        Ilya,您还可以在项目属性->配置属性-> C / C ++->高级->调用约定中设置默认的调用约定。 如果项目中的默认调用约定已设置为__stdcall(/ Gz),则添加__std     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?