in reply to Re: Win32::API Memory Exception with GetCommandLine() (which returns a static string)
in thread Win32::API Memory Exception with GetCommandLine() (which returns a static string)
At the core of Win32::API are several small piece of assembler code:
#if (defined(__BORLANDC__) && __BORLANDC__ >= 452) #define ASM_LOAD_EAX(param,type) { \ __asm { \ mov eax, type param ; \ push eax ; \ } /* MSVC compilers */ #elif defined _MSC_VER /* Disable warning about one missing macro parameter. TODO: How we define a macro with an optional (empty) parameter? + */ #pragma warning( disable : 4003 ) #define ASM_LOAD_EAX(param,type) { \ __asm { mov eax, type param }; \ __asm { push eax }; \ } /* GCC-MinGW Compiler */ #elif (defined(__GNUC__)) #define ASM_LOAD_EAX(param,...) asm ("push %0" :: "g" (param)); #endif ... ASM_LOAD_EAX(pParam, dword ptr); ## many similar ... #if (defined(_MSC_VER) || defined(BORLANDC)) __asm { mov eax, dword ptr [dParam + 4] ; push eax ; mov eax, dword ptr [dParam] ; push eax ; }; #elif (defined(__GNUC__)) /* probably uglier than necessary, but works */ asm ("pushl %0":: "g" (((unsigned int*)&dParam)[1])); asm ("pushl %0":: "g" (((unsigned int*)&dParam)[0])); /* { int idc; printf ("dParam = "); for (idc = 0; idc < sizeof(dParam); idc++) { printf(" %2.2x",((unsigned char*)&dParam)[idc]); } printf(" %f\n", dParam); } */ #endif
One has to suspect, if the OP confirms he is using a mingw built version of Perl that the problem lies in there somewhere. Does mingw build using similar calling conventions to MSC? That is the PASCAL calling convention for system apis.
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^3: Win32::API Memory Exception with GetCommandLine() (which returns a static string)
by syphilis (Archbishop) on Jul 06, 2007 at 05:30 UTC | |
by BrowserUk (Patriarch) on Jul 06, 2007 at 05:52 UTC | |
by syphilis (Archbishop) on Jul 06, 2007 at 07:31 UTC | |
by BrowserUk (Patriarch) on Jul 06, 2007 at 11:29 UTC | |
by Wyrdweaver (Beadle) on Jul 07, 2007 at 18:15 UTC |