c++ - 调用dll方法时如何解决访问冲突写入位置

标签 c++ dll getprocaddress

我使用 GetProcAddress 来访问标准 Isapi Filter 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!!!!!!!!!!!!!
       }
   }
}

最佳答案

我发现的一个问题是您的函数指针声明不正确。

根据 Microsoft 文档,GetFilterVersion原型(prototype)为:

BOOL WINAPI GetFilterVersion(PHTTP_FILTER_VERSION pVer);

WINAPI 是一个 Windows 宏,实际上定义为 __stdcall,因此,当您使用 __cdecl 时,您错误地声明了函数指针。

What does WINAPI mean?

因此,您的声明应该是:

typedef BOOL(__stdcall * TRIRIGAISAPIV)(PHTTP_FILTER_VERSION);

关于c++ - 调用dll方法时如何解决访问冲突写入位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34912195/

相关文章:

c++ - OpenMPI MPI_Gather 段错误或断言错误

c# - 将程序集作为模块/插件加载,同时避免重复和脆弱性

java - 无法在 AMD 64 位平台上加载 IA 32 位 .dll

dll - 如何获取注入(inject)DLL到另一个进程的Remote Proc地址

c - 从加载了转发到另一个 DLL 的非标准路径的 DLL 加载符号

C++ GetProcAddress() 找不到静态类的方法

c++ - 使用 DialogBox 作为主窗口是否正确/合适?

c++ - Opencv:如何计算 3d 直方图?

c++ - 想要 ostringstream 修改传递的字符串

c++ - MSVC 2017 在共享库中创建模板函数的拷贝