Intel® Fortran Compiler
Build applications that can scale for the future with optimized code designed for Intel® Xeon® and compatible processors.
29236 토론

Managed Debugging Assistant PInvokeStackImbalance

CharlieG
초급자
4,074 조회수
I'm starting to use Visual Studio 2010 and Intel Visual Fortran Composer XE 2011 on an existing code base. I'm getting an error that I haven't seen before:

Managed Debugging Assistant 'PInvokeStackImbalance' has detected a problem in '...\\FCCMod.exe'. Additional Information: A call to PInvoke function 'FCCMod!FCCMod.clsFCCDll::FCCMod' has unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the target unmanged signature.

Seems like they're trying to tell me what the problem is but I'm not a knowledgable enough programmer to understand the message. If anyone could help me out I'd appreciate it.

My Visual Basic Code:

Public Class clsFCCDll

'FCC Model connections

Public Declare Sub FCCMod Lib "FCCmod.dll" Alias "FCCMod" (ByVal CommonUserDataPath As String, ByVal ExePath As String)

Public Sub FCCModel(ByVal CommonUserDataPath As String, ByVal ExePath As String)

FCCMod(CommonUserDataPath, ExePath)

End Sub

End Class

My Visual Fortran Code:

!DEC$NOFREEFORM

subroutine FCCMod(strUserAppPath, strExePath)

!DEC$ATTRIBUTES ALIAS:'FCCMod'::FCCMod

!DEC$ATTRIBUTES DLLEXPORT :: FCCMod

use IFCOM

use IFCOMTY

use IFWIN

CHARACTER(256), INTENT(IN) :: strUserAppPath

!DEC$ ATTRIBUTES REFERENCE :: strUserAppPath

CHARACTER(256), INTENT(IN) :: strExePath

!DEC$ ATTRIBUTES REFERENCE :: strExePath

status = AllocConsole()

ILEN = INDEX(strUserAppPath,CHAR(0)) - 1

UserAppPath = strUserAppPath(1:ILEN)

ILEN = INDEX(strExePath,CHAR(0)) - 1

ExePath = strExePath(1:ILEN)

And much more...

0 포인트
1 솔루션
Wendy_Doerner__Intel
소중한 기여자 I
4,074 조회수
Charlie,

Thanks for posting your code.

The unbalanced stack error was caused by the incorrect calling convention of the fortran subroutine.The VB code assumes the subroutine cleans up the stack when returning; however, the default calling convention of Fortran requires the caller clean up the stack. Then the runtime system detected the mis-matched stack pointer before/after the call. To fix this, please

Change the subroutine to STDCALL like:

!DEC$ATTRIBUTES DLLEXPORT,STDCALL :: FCCMod

For reference:
http://support.microsoft.com/kb/153586
The Mixed Language section of the IntelVIsual Compiler documentation

------

Wendy

Attaching or including files in a post

원본 게시물의 솔루션 보기

0 포인트
9 응답
Wendy_Doerner__Intel
소중한 기여자 I
4,074 조회수
One change in the Intel Visual Fortran Compiler 2011 is that strings are no longer null terminated (they were by chance in previous releases). Fortran expects this, but Basic does not generate null terminated strings so you may need to add null at the end of strings you are passing to Fortran.

------

Wendy

Attaching or including files in a post

0 포인트
CharlieG
초급자
4,074 조회수
I tried concatenating a CHR(0) to the end of my strings in VB before passing them to Fortran but it did not fix the error.
0 포인트
strohhaecker
초급자
4,074 조회수
> strings are no longer null terminated (they were by chance in previous releases). Fortran expects this

Can you please elaborate on this? As I understood, it's the other way round, older versions zero-padded the Fortran strings so passing them to C-style routines wasworking (by accident), but the 12.x release may not "terminate" the Fortran string with a zero character so requires user interaction.
0 포인트
Steven_L_Intel1
4,074 조회수
There was a case where a user program was relying on a character variable being followed by a NUL, which sometimes was the case in version 11.1 but much less so in version 12. However, I don't think VB uses NUL-terminated strings. Either it passes a BSTRING descriptor (which requires calling routines to create and read in Fortran) or it passes just the data with no length.
0 포인트
Wendy_Doerner__Intel
소중한 기여자 I
4,074 조회수
I think we would need a reproducing test case or more detail on the error message to give you any more help. It does look like the error message is trying to mark a disconnect between your call to DLL so I would like at the parameters you are passing to see if they are in format your called procedure is expecting.

------

Wendy

Attaching or including files in a post

0 포인트
CharlieG
초급자
4,074 조회수
Here's a test case that reproduces the error.

Charlie
0 포인트
Wendy_Doerner__Intel
소중한 기여자 I
4,075 조회수
Charlie,

Thanks for posting your code.

The unbalanced stack error was caused by the incorrect calling convention of the fortran subroutine.The VB code assumes the subroutine cleans up the stack when returning; however, the default calling convention of Fortran requires the caller clean up the stack. Then the runtime system detected the mis-matched stack pointer before/after the call. To fix this, please

Change the subroutine to STDCALL like:

!DEC$ATTRIBUTES DLLEXPORT,STDCALL :: FCCMod

For reference:
http://support.microsoft.com/kb/153586
The Mixed Language section of the IntelVIsual Compiler documentation

------

Wendy

Attaching or including files in a post

0 포인트
CharlieG
초급자
4,074 조회수
That did it. Thanks for the help.
0 포인트
onkelhotte
새로운 기여자 II
4,074 조회수
Had the same problem with WPF and a Fortran DLL.

That didnt happen with Windows Forms and the same DLL though...

Now I will have a nice weekend :-)

Markus
0 포인트
응답