我正在学习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
?当返回类型和函数名称之间有什么东西时,它是什么意思?
除其他外,还有两种类型的调用约定--stdcall和cdecl.我对他们几乎没有问题:
我正在开发一个相当大的代码库,其中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.Cdecl
C#中都有.为什么不CallingConvention.Stdcall
呢?或者,此外,为什么__stdcall
C++中存在?
提前致谢!
我正在尝试将Windows应用程序移植到Linux.这个appplication用__stdcall
属性标记了一些函数.但是,朋友告诉我,stdcall仅用于Windows并且在linux中没有任何意义(但是Windows GCC中存在DOES).我试图在谷歌搜索这个,并得到一些结果表明在Linux中存在stdacll.
所以......?
此外,对于GCC,我看到了2个实现:__attribute__((__stdcall__))
和__attribute__((stdcall))
(没有stdcall附近的下划线).哪一个是首选(如果适用于Linux)?
谢谢!
我试图导出一个简单的测试函数,用于处理一个应用程序(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++ 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?
非常感谢.
我有一个程序,我需要创建一个DLL,希望在C#中.该程序是用Delphi编写的,我有一个代码的接口文件.该接口使用stdcall调用约定.
是否可以创建符合接口的C#DLL并可以在Delphi应用程序中使用?
是否有一些示例代码演示如何将C#DLL编码为stdcall接口方法?
我有一个第三方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 …
我正在使用GCC开发自己的内核,当从asm代码调用C函数时,我必须自己做add esp,xx
.经过一番搜索,我发现这stdcall
是微软的一项发明,不能在GCC中使用它.有没有方便的方法来完成这项工作?
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
修饰符的问题.这是编译器错误吗?