【发布时间】:2017-07-12 13:37:50
【问题描述】:
面对
Win32::API 使用错误的原型调用函数并导致 C 堆栈一致性 EBP=18fde0 ESP=18fdd0
下面是perl和C代码
my $CheckSqlAnyWindow = new Win32::API($dllfile,
"CheckSqlAnyWindow", [ 'N', 'P', 'P' ], 'N');
my $hwndSqlany = pack("L", 0);
my ($i, $sqlanyWinId);
START:
for ($i = 0; $i < $numRetries; $i++)
{
$rc = $CheckSqlAnyWindow->Call($procId,"$engine - Adaptive Server Anywhere - 12.0.1 (3817)", $hwndSqlany);
if ($rc <= 0)
{
$Cisco::DbUtils::errstr = Win32::FormatMessage( Win32::GetLastError());
return 1;
}
}
c 代码
BOOL CheckSqlAnyWindow(DWORD pid, char *winTitle, DWORD * hwnd)
{
StartDbInfo startDbBuf;
BOOL rc;
startDbBuf.pid = pid;
startDbBuf.hwnd = NULL;
strcpy(startDbBuf.winTitle, winTitle);
rc = EnumWindows((WNDENUMPROC) getWindowId, (LPARAM) &startDbBuf);
memcpy((DWORD *) hwnd, (DWORD *) &startDbBuf.hwnd, sizeof(DWORD));
return (TRUE);
}
谁能指出这里要进行的更正吗?
【问题讨论】:
-
在 C 函数的定义中尝试
WINAPI或__stdcall