开发者

Access Violation calling imported function

开发者 https://www.devze.com 2023-03-09 15:38 出处:网络
I\'ve got a function imported from a DLL. I control the source of both the host executable and the dynamic library. Now, in DLLMain then I used MessageBox to pop up the address of the function I\'m ex

I've got a function imported from a DLL. I control the source of both the host executable and the dynamic library. Now, in DLLMain then I used MessageBox to pop up the address of the function I'm exporting, and compared it using a breakpoint to the function pointer returned by GetProcAddress, and they're identical.

However, when I try to call the function, I get an access violation. The function in question just returns NULL and has no logic, so it can't be thrown by the function specifically.

How can calling a known valid function pointer, with the correct signature, and verified safe logic, yield an access violation?

Edit: Information gained through another separate question about why the debugger is dying in this situation suggests that my stack is being smashed too? That would make more sense than an AV, but the function pointer and the function are completely compatible and the address is correct.

extern "C" Render* __cdecl CreateRender(WindowsOS* ptr) {
    return nullptr;
}

typedef Render*(__cdecl *RendererCreateFunction)(WindowsOS*);

I used a simple, small piece of code in DLLMain to qualify that they are in fact compatible as far as the compiler is concerned.

BOOL WINAPI DllMain(
  __in  HINSTANCE hinstDLL,
  __in  DWORD fdwReason,
  __in  LPVOID lpvReserved
) {
    RendererCreateFunction func = &开发者_运维百科CreateRender;
}

If they aren't compatible (they include the same header) then the compiler should throw an error and refuse to build the DLL, but it accepts this just fine.


If this is DLLMain you use in your code then it has no return statement and most likely returns a not initialized value, quite probably 0 as a good main function, which effectively unloads the DLL from the memory. Make sure DLLMain returns TRUE.


I completely failed this one. Wrote a class that manages a resource without respecting my move and copy semantics properly. Turns out that I was calling FreeLibrary() on the library in question mistakenly before I needed to use it.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号