DLL help needed

Cogman

Lifer
Sep 19, 2000
10,286
145
106
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.
 

Markbnj

Elite Member <br>Moderator Emeritus
Moderator
Sep 16, 2005
15,682
14
81
www.markbetz.net
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.
 

Cogman

Lifer
Sep 19, 2000
10,286
145
106
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 :(.
 

degibson

Golden Member
Mar 21, 2008
1,389
0
0
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.
 

Cerebus451

Golden Member
Nov 30, 2000
1,425
0
76
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).
 

Cogman

Lifer
Sep 19, 2000
10,286
145
106
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 :D just barely checked.