Strange stack variable corruption error after calling extern(C) function

cc via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue May 3 12:06:30 PDT 2016


On Tuesday, 3 May 2016 at 12:48:37 UTC, Benjamin Thaut wrote:
> It seems that one of the fmod functions you declared is not 
> correct. Either the fmod api is not using the c calling 
> convention or you made a mistake when declaring the paramters 
> of the fmod functions. You should double check that the 
> functions match the fmod headers.

I see, thanks.  Double checking the original headers, I see the 
function is defined as:

FMOD_RESULT F_API FMOD_System_CreateSound               
(FMOD_SYSTEM *system, const char *name_or_data, FMOD_MODE mode, 
FMOD_CREATESOUNDEXINFO *exinfo, FMOD_SOUND **sound);


F_API seems to be defined as follows:

...
#elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || 
defined(_WIN64)
     #define F_STDCALL _stdcall
     #define F_DECLSPEC __declspec
     #define F_DLLEXPORT ( dllexport )
...
#ifdef DLL_EXPORTS
     #define F_API F_DECLSPEC F_DLLEXPORT F_STDCALL
#else
     #define F_API F_STDCALL
#endif


I tried going by the information suggested on this page: 
http://wiki.dlang.org/D_binding_for_C#cdecl.2C_pascal.2C_stdcall
but if I declare the function, in D, as:
extern(Windows) FMOD_RESULT FMOD_System_CreateSound               
(FMOD_SYSTEM *system, const char *name_or_data, FMOD_MODE mode, 
FMOD_CREATESOUNDEXINFO *exinfo, FMOD_SOUND **sound);

it fails to link with "Error 42: Symbol Undefined 
_FMOD_System_CreateSound at 20".  With extern(C) it compiles and 
runs but the problem from above persists.



More information about the Digitalmars-d-learn mailing list