DLL help needed

Cogman

Lifer
Sep 19, 2000
10,283
134
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,283
134
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,283
134
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 just barely checked.
 
sale-70-410-exam    | Exam-200-125-pdf    | we-sale-70-410-exam    | hot-sale-70-410-exam    | Latest-exam-700-603-Dumps    | Dumps-98-363-exams-date    | Certs-200-125-date    | Dumps-300-075-exams-date    | hot-sale-book-C8010-726-book    | Hot-Sale-200-310-Exam    | Exam-Description-200-310-dumps?    | hot-sale-book-200-125-book    | Latest-Updated-300-209-Exam    | Dumps-210-260-exams-date    | Download-200-125-Exam-PDF    | Exam-Description-300-101-dumps    | Certs-300-101-date    | Hot-Sale-300-075-Exam    | Latest-exam-200-125-Dumps    | Exam-Description-200-125-dumps    | Latest-Updated-300-075-Exam    | hot-sale-book-210-260-book    | Dumps-200-901-exams-date    | Certs-200-901-date    | Latest-exam-1Z0-062-Dumps    | Hot-Sale-1Z0-062-Exam    | Certs-CSSLP-date    | 100%-Pass-70-383-Exams    | Latest-JN0-360-real-exam-questions    | 100%-Pass-4A0-100-Real-Exam-Questions    | Dumps-300-135-exams-date    | Passed-200-105-Tech-Exams    | Latest-Updated-200-310-Exam    | Download-300-070-Exam-PDF    | Hot-Sale-JN0-360-Exam    | 100%-Pass-JN0-360-Exams    | 100%-Pass-JN0-360-Real-Exam-Questions    | Dumps-JN0-360-exams-date    | Exam-Description-1Z0-876-dumps    | Latest-exam-1Z0-876-Dumps    | Dumps-HPE0-Y53-exams-date    | 2017-Latest-HPE0-Y53-Exam    | 100%-Pass-HPE0-Y53-Real-Exam-Questions    | Pass-4A0-100-Exam    | Latest-4A0-100-Questions    | Dumps-98-365-exams-date    | 2017-Latest-98-365-Exam    | 100%-Pass-VCS-254-Exams    | 2017-Latest-VCS-273-Exam    | Dumps-200-355-exams-date    | 2017-Latest-300-320-Exam    | Pass-300-101-Exam    | 100%-Pass-300-115-Exams    |
http://www.portvapes.co.uk/    | http://www.portvapes.co.uk/    |