【发布时间】:2020-02-07 19:36:41
【问题描述】:
在发布这个问题之前,我已经阅读了一些文档,SO answers 并观看了一些视频以了解 __stdcall。到目前为止,我已经理解这是一个调用约定,并指定从右到左将参数推送到堆栈上。这也表示何时清除堆栈。
但我仍然无法理解我应该使用__stdcall 的优势和案例。
我遇到了以下代码,它在关闭 OPC-UA 客户端时调用。我看到这应该遵循__stdcall 调用约定,但为什么呢?如果没有为以下方法指定__stdcall,可能会发生什么情况?
OpcUa_StatusCode __stdcall opcua_client::onShutdownMessage(OpcUa_Handle hApplication, OpcUa_Handle hSession, OpcUa_String strShutdownMessage, void* extraParam)
{
opcua_client* pOpcClient = NULL;
if (extraParam)
{
try
{
pOpcClient = qobject_cast <opcua_client*>((QObject*)extraParam);
throw(55);
}
catch (int exeption)
{
}
}
OpcUa_StatusCode uStatus = OpcUa_Good;
QString strShutDownMsg = QString::fromUtf8(OpcUa_String_GetRawString(&strShutdownMessage));
bool bOK;
OpcUa_StatusCode uClientLibStatus = uClientLibStatus = strShutDownMsg.toUInt(&bOK, 16);
if (pOpcClient)
{
if (uClientLibStatus > 0)
pOpcClient->process_onShutdownMessage(uClientLibStatus);
}
else
{
return uStatus;
}
return uStatus;
}
【问题讨论】:
-
它是 32 位代码中操作系统和 COM 库的标准调用约定。 OPC 很大程度上基于 COM,因此预计会看到很多 stdcall。尽管 onShutdownMessage() 不是标准接口函数之一。也许您使用了一个指示 stdcall 的工具包,一点也不稀奇。