2016-07-29 8 views
0

Fortran 90(コンパイラはIntel Parallel Studio XE 2011)によって生成されたVB.NET 2010でDLLを呼び出そうとしています。しかし、 "PInvokeStackImbalance"は、実行すると発生します。 私は以下のメソッドを試してみました: (1) "INTEGER"、 "LONG"、 "INT32" ...のような宣言のデータtyeを変更しますが、エラーは依然として終了します。 (2)実際の&仮想パラメータで配列の寸法を確認してください。輸送時に配列がないため、このメソッドは無視されます。 (3) "デバッグ - 例外 - 管理されたデバッグアシスタント"の "ContextSwitchDeadlock"と "PInvokeStackImbalance"のオプションのチェックを外してください。実際の問題を解決できないと思いますので使用しません。VB.NET 2010で "DLL"(Fortranで生成)を呼び出すときのPInvokeStackImbalance

異なる循環でエラーが発生していることがわかりました(下の図を参照してください。98と99でそれぞれ発生しています)。つまり、DLL自体にインターフェイスではなくエラーがありますか? enter image description here enter image description here

以下は、VB.netの私のコードとFortanの宣言です。 (1)VB.net:

Public Class Form1 
    Public Declare Sub main_sub Lib "smgama_dll.dll" (ByRef cla As Long, ByRef nf As Long) 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     Dim cla, nf As Long 
     cla = CLng(TextBox1.Text) 
     nf = CLng(TextBox2.Text) 
     Call main_sub(cla, nf) 
    End Sub 

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click 
    Application.Exit() 
End Sub 
End Class 

(2)のFortran:

subroutine main_sub(cla,nf) 
    !DEC$ ATTRIBUTES DLLEXPORT::main_sub 
    !DEC$ ATTRIBUTES ALIAS:"main_sub"::main_sub 

    use Global 
    use suba 
    use suba1 
    use suba2 

    implicit none 
    real,allocatable::upbound(:),downbound(:),xbest(:),y(:),ybest(:),upbound1(:),downbound1(:),g_x(:),g_y(:) 
    real,allocatable::QC(:),QCC(:),Q_mean(:) 
    character(len=20)::filename 
    integer::n,szz,tt,nf,i,iter,cla,j 
...... 
End subroutine 
+1

今後の参考として、画像へのリンクを提供し、「ここに画像の説明を入力」というプロンプトが表示されたら、実際に画像の説明を入力してください。 – jmcilhinney

+0

これはVB6宣言です。 VB.NETでは "整数" =整数ではなく、Longです。 –

答えて

0

スタック不均衡はほとんど常にVB.NETでVB6の宣言を使用することから生じます。ほとんどのAPI関数はVB6ではLong、VB.NETではIntegerを意味する32ビットの数値で動作します。あなたがLongを使用しているなら、ほぼ確実にVB6宣言を使用しています。 Longタイプを少なくともIntegerに変更しても問題ありません。また、その他の変更が必要な場合もあります。

関連する問題