_thiscall变成_stdcall的时候, 成员函数的参数中的隐形this消失了。

bsnry 2012-09-25 10:03:48

_thiscall变成_stdcall的时候, 成员函数的参数中的隐形this消失了。

难道不会出现什么问题吗?






为什么潘爱民的书上 有


extern "C" const GUID IID_Second =
{ 0x54bf6568, 0x1007, 0x11d1,
{ 0xb0, 0xaa, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00} } ;

类代码? 看到extern "C" 没有?


感觉多余了吧, 这句代码 是放在dll中。 而且这个数组并非是导出的



...全文
243 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Coder_Y_Jao 2012-09-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

好吧

那么把_thiscall 改成 _stdcall后有啥好处

[/Quote]

为了与语言无关的兼容性
_stdcall是大多数语言都支持的调用约定,_thiscall则用于c++的成员函数,需要ECX存储this。
你可能会问,COM都编译成二进制文件了,不都一样保证本身的功能正常,有什么关系呢。
考虑下面的情况,一个不支持_thiscall的语言中,调用某个成员函数参数入栈后,是不可能将this存储在ecx的。
而你编译好的COM(_thiscall)中,则使用这个ecx来间接操作其他成员等,这就导致了不兼容。
而_stdcall则直接push this指针当做参数入栈,COM中也是_stdcall,不需要关心那个ecx,通过栈来间接操作就好了。
  • 打赏
  • 举报
回复
好处就是符合COM规范了
bsnry 2012-09-25
  • 打赏
  • 举报
回复
好吧

那么把_thiscall 改成 _stdcall后有啥好处



[Quote=引用 7 楼 的回复:]

A obj;
obj.fun(2);
002D13BE push 2
002D13C0 lea eax,[obj]
002D13C3 push eax <=======这不就是变成参数了么
002D13C4 call A::fun (2D10F0h)
[/Quote]
  • 打赏
  • 举报
回复
A obj;
obj.fun(2);
002D13BE push 2
002D13C0 lea eax,[obj]
002D13C3 push eax <=======这不就是变成参数了么
002D13C4 call A::fun (2D10F0h)
bsnry 2012-09-25
  • 打赏
  • 举报
回复
extern "C" 放在这里没看到有什么作用!



[Quote=引用 4 楼 的回复:]

就是GUID 标准写法
[/Quote]
bsnry 2012-09-25
  • 打赏
  • 举报
回复
看deom吧,

两个对比








--- e:\c_plus_plus\test\test\test2.cpp -----------------------------------------
class A
{
public:
void _stdcall fun( int val){}
00BC1430 push ebp
00BC1431 mov ebp,esp
00BC1433 sub esp,0C0h
00BC1439 push ebx
00BC143A push esi
00BC143B push edi
00BC143C lea edi,[ebp-0C0h]
00BC1442 mov ecx,30h
00BC1447 mov eax,0CCCCCCCCh
00BC144C rep stos dword ptr es:[edi]
00BC144E pop edi
00BC144F pop esi
00BC1450 pop ebx
00BC1451 mov esp,ebp
00BC1453 pop ebp
00BC1454 ret 8


A obj;
obj.fun(2);
002D13BE push 2
002D13C0 lea eax,[obj]
002D13C3 push eax
002D13C4 call A::fun (2D10F0h)




///////////////////////////////////////////////////////////////////////////////////////
class A
{
public:
void fun( int val){}
008B1430 push ebp
008B1431 mov ebp,esp
008B1433 sub esp,0CCh
008B1439 push ebx
008B143A push esi
008B143B push edi
008B143C push ecx
008B143D lea edi,[ebp-0CCh]
008B1443 mov ecx,33h
008B1448 mov eax,0CCCCCCCCh
008B144D rep stos dword ptr es:[edi]
008B144F pop ecx
008B1450 mov dword ptr [ebp-8],ecx
008B1453 pop edi
008B1454 pop esi
008B1455 pop ebx
008B1456 mov esp,ebp
008B1458 pop ebp
008B1459 ret 4




A obj;
obj.fun(2);
008B13BE push 2
008B13C0 lea ecx,[obj]
008B13C3 call A::fun (8B10E6h)










[Quote=引用 3 楼 的回复:]

引用 2 楼 的回复:

你看过反汇编吗

还有我记得 钱松林的书上也提到过, 如果在类中强用stdcall之类

this参数消失了,


引用 1 楼 的回复:

参数多了一个this参数

没this的话,咋知道是哪个对象调用的?
[/Quote]
project2502 2012-09-25
  • 打赏
  • 举报
回复
就是GUID 标准写法
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

你看过反汇编吗

还有我记得 钱松林的书上也提到过, 如果在类中强用stdcall之类

this参数消失了,


引用 1 楼 的回复:

参数多了一个this参数
[/Quote]
没this的话,咋知道是哪个对象调用的?
bsnry 2012-09-25
  • 打赏
  • 举报
回复
你看过反汇编吗

还有我记得 钱松林的书上也提到过, 如果在类中强用stdcall之类

this参数消失了,


[Quote=引用 1 楼 的回复:]

参数多了一个this参数
[/Quote]
  • 打赏
  • 举报
回复
参数多了一个this参数

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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