标签: stdcall

什么是__stdcall?

我正在学习Win32编程,WinMain原型如下:

int WINAPI WinMain ( HINSTANCE instance, HINSTANCE prev_instance, PSTR cmd_line, int cmd_show )
Run Code Online (Sandbox Code Playgroud)

我很困惑这个WINAPI标识符的用途和发现:

#define WINAPI      __stdcall
Run Code Online (Sandbox Code Playgroud)

这是做什么的?在返回类型之后,我对此感到困惑.什么是__stdcall?当返回类型和函数名称之间有什么东西时,它是什么意思?

c winapi calling-convention stdcall

137
推荐指数
7
解决办法
10万
查看次数

stdcall和cdecl

除其他外,还有两种类型的调用约定--stdcallcdecl.我对他们几乎没有问题:

  1. 当调用cdecl函数时,调用者如何知道它是否应该释放堆栈?在调用站点,调用者是否知道被调用的函数是cdecl还是stdcall函数?它是如何工作的 ?调用者如何知道它是否应该释放堆栈?或者它是连接者的责任吗?
  2. 如果声明为stdcall的函数调用一个函数(其调用约定为cdecl),或者相反,那么这是不合适的吗?
  3. 一般来说,我们可以说哪个调用会更快--cdecl或stdcall?

c++ cdecl stdcall

82
推荐指数
4
解决办法
10万
查看次数

为什么Cdecl调用在"标准"P/Invoke公约中经常不匹配?

我正在开发一个相当大的代码库,其中C++函数是从C#调用P /.

我们的代码库中有很多调用,比如......

C++:

extern "C" int __stdcall InvokedFunction(int);
Run Code Online (Sandbox Code Playgroud)

使用相应的C#:

[DllImport("CPlusPlus.dll", ExactSpelling = true, SetLastError = true, CallingConvention = CallingConvention.Cdecl)]
    private static extern int InvokedFunction(IntPtr intArg);
Run Code Online (Sandbox Code Playgroud)

我已经搜索了网(在我有能力的范围内),因为为什么存在这种明显的不匹配.例如,为什么C#中有Cdecl,而C++中有__stdcall?显然,这会导致堆栈被清除两次,但是,在这两种情况下,变量都以相同的相反顺序被压入堆栈,这样我就不会看到任何错误,尽管在发生的情况下可能会清除返回信息.在调试期间尝试跟踪?

来自MSDN:http: //msdn.microsoft.com/en-us/library/2x8kf7zx%28v=vs.100%29.aspx

// explicit DLLImport needed here to use P/Invoke marshalling
[DllImport("msvcrt.dll", EntryPoint = "printf", CallingConvention = CallingConvention::Cdecl,  CharSet = CharSet::Ansi)]

// Implicit DLLImport specifying calling convention
extern "C" int __stdcall MessageBeep(int);
Run Code Online (Sandbox Code Playgroud)

再一次,extern "C"C++代码和CallingConvention.CdeclC#中都有.为什么不CallingConvention.Stdcall呢?或者,此外,为什么__stdcallC++中存在?

提前致谢!

c# c++ pinvoke cdecl stdcall

53
推荐指数
2
解决办法
2万
查看次数

Linux中有STDCALL吗?

我正在尝试将Windows应用程序移植到Linux.这个appplication用__stdcall属性标记了一些函数.但是,朋友告诉我,stdcall仅用于Windows并且在linux中没有任何意义(但是Windows GCC中存在DOES).我试图在谷歌搜索这个,并得到一些结果表明在Linux中存在stdacll.

所以......?

此外,对于GCC,我看到了2个实现:__attribute__((__stdcall__))__attribute__((stdcall))(没有stdcall附近的下划线).哪一个是首选(如果适用于Linux)?

谢谢!

c++ linux porting stdcall

18
推荐指数
2
解决办法
2万
查看次数

使用extern c和dllexport vs模块定义的stdcall名称修改(msvc ++)

我试图导出一个简单的测试函数,用于处理一个应用程序(fyi:mIRC),它将调用约定指定为:

int __stdcall test_func(HWND mWnd, HWND aWnd, char *data, char *parms, BOOL show, BOOL nopause)
Run Code Online (Sandbox Code Playgroud)

现在,要从应用程序中调用它,我将使用test_func,但我注意到由于名称错误,它并不像我想象的那么简单.

通过类似的主题,我已经了解到将extern"C"__declspec(dllexport)结合使用是一种等效的(某种程度上)方法,可以将重整数据删除到模块定义(.def).但是,当使用extern/dllexport方法时,我的函数(作为示例)始终是_test_func @ numbers,而.def删除了所有需要导出到的应用程序所需的修改.

有人可以解释一下这是为什么吗?我只是对这两种方法感到好奇.谢谢!

c++ name-mangling stdcall dllexport visual-c++

15
推荐指数
2
解决办法
1万
查看次数

declspec和stdcall vs仅限于declspec

我是C++ DLL导入主题的新人,可能是我的问题很容易但我在谷歌上找不到它.

我有一个非常简单的C++ win32 dll:

#include <iostream>

using namespace std;

extern "C"
{
    __declspec(dllexport) void __stdcall DisplayHellowFromDLL()
    {
        cout<<"Hi"<<endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

当我从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();
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

正如我所料,输出是:"这是C#程序""嗨".

现在,如果我将C函数的声明更改为:

__declspec(dllexport) void DisplayHellowFromDLL()
Run Code Online (Sandbox Code Playgroud)

没有__stdcall,我也没有任何问题,问题是:

我什么时候才真正需要__declspec(dllexport)TYPE __stdcall,何时我只能使用__declspec(dllexport)TYPE?

非常感谢.

c# c++ dllimport stdcall

14
推荐指数
3
解决办法
1万
查看次数

使用stdcall创建可以在Delphi应用程序中导入的C#DLL - 可能?

我有一个程序,我需要创建一个DLL,希望在C#中.该程序是用Delphi编写的,我有一个代码的接口文件.该接口使用stdcall调用约定.

是否可以创建符合接口的C#DLL并可以在Delphi应用程序中使用?

是否有一些示例代码演示如何将C#DLL编码为stdcall接口方法?

c# delphi delphi-2007 stdcall

10
推荐指数
3
解决办法
1万
查看次数

改变呼叫公约

我有一个第三方C API,需要一个__stdcall回调函数.
我的代码有一个外部提供的 __cdecl回调函数.

我无法将函数指针传递给C-API,因为它们被认为是不同的类型.
绕过类型系统并reinterpret_cast<>自然地使用会导致运行时错误.

下面是一个例子在这里:

// C-API
// the stdcall function pointer type:
typedef CTMuint(__stdcall *CTMwritefn)(const void *aBuf, CTMuint aCount, void *aUserData);

// A function needing the callback: 
CTMEXPORT void __stdcall ctmSaveCustom(CTMcontext aContext, CTMwritefn aWriteFn, void *aUserData, int *newvertexindex);
                                                            ^^^^^^^^^^^^^^^^^^^

//////////////////////////////////////////////////////////////////////////////

// C++
CTMuint __cdecl my_func(const void *aBuf, CTMuint aCount, void *aUserData);

// I want to call here:
ctmSaveCustom(context, my_func, &my_data, nullptr);
//                     ^^^^^^^
Run Code Online (Sandbox Code Playgroud)

有没有办法安全地将一个调用约定的函数转换和/或包装到另一个调用约定中?

我确实通过传递一个调用第二个捕获lambda的casted …

c++ function-pointers cdecl calling-convention stdcall

10
推荐指数
1
解决办法
1268
查看次数

GCC中的stdcall是否有任何等价物?

我正在使用GCC开发自己的内核,当从asm代码调用C函数时,我必须自己做add esp,xx.经过一番搜索,我发现这stdcall是微软的一项发明,不能在GCC中使用它.有没有方便的方法来完成这项工作?

assembly gcc kernel stdcall

9
推荐指数
1
解决办法
6872
查看次数

__stdcall函数指针的模板部分特化

typedef bool (*my_function_f)(int, double);
typedef bool (__stdcall *my_function_f2)(int, double);
//            ^^^^^^^^^

template<class F> class TFunction;

template<class R, class T0, class T1>
class TFunction<R(*)(T0,T1)>
{
  typedef R (*func_type)(T0,T1);
};

int main()
{
  TFunction<my_function_f> t1;  // works on x64 and win32
  TFunction<my_function_f2> t2; // works on x64 and doesn't work on win32

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码在Visual C++ 2010中给出了以下错误:

1>e:\project\orwell\head\multimapwizard\trunk\externals.cpp(49): error C2079: 't2' uses undefined class 'Externals::TFunction<F>'
1>          with
1>          [
1>              F=Externals::my_function_f2
1>          ]
Run Code Online (Sandbox Code Playgroud)

正如您可以看到__stdcall修饰符的问题.这是编译器错误吗?

c++ templates stdcall template-specialization

8
推荐指数
1
解决办法
1533
查看次数