• We’re currently investigating an issue related to the forum theme and styling that is impacting page layout and visual formatting. The problem has been identified, and we are actively working on a resolution. There is no impact to user data or functionality, this is strictly a front-end display issue. We’ll post an update once the fix has been deployed. Thanks for your patience while we get this sorted.

DLL help needed

Cogman

Lifer
Ok, I don't know if this qualifies as advanced or whatever. Here is the problem I am having. I have a pascal function that looks like this

"Function CreateTPAFromBMP( BmpDC : HDC): TPointArray;Stdcall;"

It is available in a dll and accessible through a LoadLibrary/LoadProc combination. The problem is that whenever I try (through the many methods I've tried) to call this function from c++ I get a segfault and crash. 🙁

What should the C++ function definition look like? I have tried

typedef POINT* (*CTFB)(HDC) __attribute((stdcall));

....

CTFB CreateTPAFromBMP = (CTFB)LoadProc(Handle, "CreateTPAFromBMP");
CreateTPAFromBMP(GetDC(GetDesktopWindow()));

with no luck.

I am sure the call is working as well as I have been able to load other functions without too much trouble.
 
Been a long time, but here's a bump for you anyway. I think at the very least the C++ declaration of the function should be extern C so that C++ isn't expecting a mangled name. Also make sure stdcall is correct. Pascal and C/C++ push arguments onto the stack in opposite orders when opening a frame for a call, or at least they used to. Make sure the Pascal function is compiled to use C calling conventions.
 
Originally posted by: Markbnj
Been a long time, but here's a bump for you anyway. I think at the very least the C++ declaration of the function should be extern C so that C++ isn't expecting a mangled name. Also make sure stdcall is correct. Pascal and C/C++ push arguments onto the stack in opposite orders when opening a frame for a call, or at least they used to. Make sure the Pascal function is compiled to use C calling conventions.

is extern C really necessary? I was able to call other functions fine without it, I would have thought that stdcall would handle that. As well, the __attribute((stdcall)) is the g++ way of making a function stdcall. Why it is so different I will never know.

Thanks for the help though. The last problem I had with loading a function was that I had the return type as an int rather then a long. Apparently if you return type isn't big enough you get a segfault and a crash 🙁.
 
extern "C" is supposed to force a compiler to make a function in C++ (and probably other languages) have C-style linking and a C-style name. extern "C" wouldn't be strictly necessary if your compiler used C-style names and linkage for non-member, non-static functions. So, as usual, it depends on the compiler.
 
Are you sure you are getting the function pointer back from your LoadProc function, or is your CreateTPAFromBMP NULL? That would certainly cause a seg fault. The stdcall convention puts the length of the argument list as part of the function name, so you might want to pass "CreateTPAFromBMP@4" as your function name (might need the leading _ as well, not sure).
 
Originally posted by: Cerebus451
Are you sure you are getting the function pointer back from your LoadProc function, or is your CreateTPAFromBMP NULL? That would certainly cause a seg fault. The stdcall convention puts the length of the argument list as part of the function name, so you might want to pass "CreateTPAFromBMP@4" as your function name (might need the leading _ as well, not sure).

The pointer is coming back correctly, though I wasn't sure 😀 just barely checked.
 
Back
Top