【发布时间】:2016-01-20 22:52:55
【问题描述】:
我正在使用 GetProcAddress 来访问标准的 Isapi 过滤器 DLL 方法 - GetFilterVersion 方法,它采用指向 HTTP_FILTER_VERSION 结构的指针。
https://msdn.microsoft.com/en-us/library/ms525822(v=vs.90).aspx
https://msdn.microsoft.com/en-us/library/ms525465(v=vs.90).aspx
我已经针对我编写的有效 Isapi 过滤器测试了代码,它运行良好。我针对来自供应商的 Isapi 过滤器调试代码(我无权访问源代码或 dll 本身之外的任何内容)并且我得到异常“访问冲突写入位置”。可能是什么问题? (两个 Isapi 过滤器都可以在 IIS 中使用。)
//Attempted to define function ptr several ways
typedef BOOL(__cdecl * TRIRIGAISAPIV)(PHTTP_FILTER_VERSION);
//typedef BOOL( * TRIRIGAISAPIV)(PHTTP_FILTER_VERSION);
//typedef BOOL(WINAPI * TRIRIGAISAPIV)(PHTTP_FILTER_VERSION);
void arbitraryMethod()
{
HINSTANCE hDLL; // Handle to DLL
TRIRIGAISAPIV lpfnDllFunc2; // Function pointer
DWORD lastError;
BOOL uReturnVal2;
hDLL = LoadLibrary(L"iisWASPlugin_http.dll"); //vendor's dll
//hDLL = LoadLibrary(L"KLTWebIsapi.dll //my dll
if (hDLL != NULL)
{
lpfnDllFunc2 = (TRIRIGAISAPIV)GetProcAddress(hDLL, "GetFilterVersion");
if (!lpfnDllFunc2)
{
lastError = GetLastError();
// handle the error
FreeLibrary(hDLL);
//return 1;
}
else
{
HTTP_FILTER_VERSION pVer = { 6 };
//Call the function via pointer; Works with my dll, fails with vendor's
uReturnVal2 = lpfnDllFunc2(&pVer);
//................ HELP!!!!!!!!!!!!!
}
}
}
【问题讨论】:
-
BOOL(__cdecl你确定这个函数的调用约定是__cdecl,而不是__stdcall?大多数 API 函数是__stdcall,最值得注意的例外是wsprintf(因为它需要一个可变参数列表)。 -
我试过 __stdcall, __cdecl , WINAPI - 两者都不起作用......
-
堆栈跟踪指向 0x000000007744F6C6 (ntdll.dll) RtlEnterCriticalSection() 处的未处理异常
标签: c++ dll getprocaddress