C# C++ 写修饰符为WINAPI的xxxA和xxxW函数

godss1 2014-11-17 08:44:10
在C#中可以很方便的调用WinAPI,特别是像MessageBox等函数它是有两个版本的:MessageBoxA和MessageBoxW,也可以通过指示获得相应的版本或自适应相应的版本。比如只需要拼写MessageBox而不用写MessageBoxA或MessageBoxW就能找到正确的函数:
[DllImport(.....)]
extern statics MessageBox(...);
现在问题来了,如果我自己也想用C/C++编写一个类似的,怎么实现呢??
我试过在用C编译器编译,只有这样才能实现
void __cdecl FuncA(char * s);
void __cdecl FuncW(wchar_t * s);

但大家应该发现我使用了调用约定__cdecl,而不是WINAPI(__stdcall),但我看到所有的WinAPI的调用约定都是WINAPI,而如果我写的C是用__stdcall就一定不成功,那到底微软自己的是怎么实现的呢?
...全文
522 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
相思梦 2014-11-19
  • 打赏
  • 举报
回复
__stdcall*
bigbaldy 2014-11-18
  • 打赏
  • 举报
回复
因为微软的加了extern "C"
Saleayas 2014-11-18
  • 打赏
  • 举报
回复
__stdcall 会添加修饰名。 使用 .def 文件导出。 不要直接使用 __declspec( dllexpor ) 来导出。
扯淡砖家 2014-11-18
  • 打赏
  • 举报
回复
加A表示窄字符串函数。加W表示宽字符串函数
足球中国 2014-11-18
  • 打赏
  • 举报
回复
最简单的方法定义def文件。 我都用这个方法。
godss1 2014-11-18
  • 打赏
  • 举报
回复
sorry 贴错图
这个才是
godss1 2014-11-18
  • 打赏
  • 举报
回复
@devmiao

我试过了,WINAPI其实就是__stdcall,如果用这个修饰符修饰,并用C编译出来的函数会重整名字为:
1 0 00011109 _FuncA@4 = @ILT+260(_FuncA@4)
2 1 000110F5 _FuncW@4 = @ILT+240(_FuncW@4)
那么我在C#中就无法简单的只用
CallingConvention.Winapi(或CallingConvention.StdCall)
和CharSet来简单的切换A和W,无法直接声明为extern static Func(string s);
而必须用显式的声明为
extern static FuncA(string s);

extern static FuncW(string s);
但微软的写的却可以,所以才感到迷惑
godss1 2014-11-18
  • 打赏
  • 举报
回复
使用__cdecl修饰符是可以成功实现A和W的,没有添加@4这样的符号,但微软是用WINAPI修饰的,其实就是__stdcall,反而实现不了,所以觉得很奇怪。你们说的.def我没有用过,会有区别吗??有没有相关的资料??
bigbaldy 2014-11-18
  • 打赏
  • 举报
回复
看错了,不好意思,还是直接写.def好
devmiao 2014-11-17
  • 打赏
  • 举报
回复
void WINAPI FuncA(char * s); void WINAPI FuncW(wchar_t * s); 这样也可以,为什么你说不可以。

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧