开发者

Making a C function pointer work with C-style stack based calling mechanics in C++

I want to call a pure C style function from a dll in my C++ program. I tried casting my function pointer using reinterpret_cast to _开发者_如何学Go_cdecl and still the calling convention of _stdcall seems to be preserved. I am new to Windows C++ programming.

Edit Code from comment

reinterpret_cast< Error ( __cdecl*)(int,int)> (GetProcAddress(Mydll::GetInstance()->ReturnDLLInstance(), "add"))(1,10) 

is my call. The actual function syntax seems to have been declared as

Error __cdecl add(int,int);

Debugger throws me the error run time check failure #0. I am working in Windows-C++


I believe the solution to your question is 'extern "C" { ...'

See http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html#faq-32.3


Usually you need to use extern "C" for this...

--- c_code.h ---

void func(int arg);
void (*func_ptr)(int arg);

--- cpp_code.cpp ---

extern "C" void func(int arg);
extern "C" void (*func_ptr)(int arg);

int main()
{
    func(20);
    *func_ptr(20);
}


There are two things at work over here.

The first is the calling convention. The calling convention is a part of the Application Binary Interface (ABI) that decides whether the caller or the callee is responsible for cleaning up the stack. If you want your functions to behave correctly both you harness and your dll will need to use the same calling convention. In WIN32 APIs this is typically __stdcall although C typically uses __cdecl.

The other issue is name mangling. Since the arguments of a function form part of the function signature in C++ (to allow for function overloading) this information is incorporated into the symbol table of you object code. This will typically be a whole bunch of extra strange characters. C does not need to do name mangling since it does not allow function overloading.

Sometimes in C++ you want to call C functions (ie C function symbols compiled by a C and not a C++ compiler). In such a case you need to define the function in an extern "C" {} block.

Hopefully this will help you out


This helped me out!

http://www.codeguru.com/forum/archive/index.php/t-70673.html

0

上一篇:

下一篇:

精彩评论

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

最新问答

问答排行榜