0

PL/I DLL を入手し、その DLL を VB.Net アプリケーションにインポートしようとしています。最初の試行は機能しましたが、数回の呼び出しの後、プログラムはコメントなしで終了しました。また、これらの関数を 2 つの異なるスレッドから 2 回呼び出すことはできません。paramone の DLL から結果を取得します。これが正しく機能しない理由と、それを機能させる方法はありますか?

<DllImport(("PLIDLL.dll"), CallingConvention:=CallingConvention.StdCall)> _
    Public Shared Sub MYFUNC(ByVal LogonString As String, _
                              <MarshalAs(UnmanagedType.VBByRefStr)> ByRef paramone As String, _
                              ByVal paramtwo As String)
    End Sub

不明な点があれば質問してください。

こんにちはリム

PS: ByRef 値の代わりに String を返すように、PL/I コードを書き直そうとしました。同じ問題。

PLI のサブ:

   MYFUNC: PROC(LOGONSTRING,PARAMONE,PARAMTWO) REORDER
          OPTIONS(FROMALIEN NODESCRIPTOR
                  BYADDR LINKAGE(STDCALL));

          DEFAULT RANGE(*) STATIC;


   DCL LOGONSTRING CHAR(30);
   DCL PARAMONE CHAR(2033);            
   DCL PARAMTWO CHAR (5500);     
4

1 に答える 1

0

少なくとも実用的な解決策が見つかりました。

Module NativeMethods

<DllImport("kernel32.dll", SetLastError:=True)> _
    Public Function LoadLibrary(ByVal lpFileName As String) As IntPtr
    End Function

<DllImport("kernel32.dll", SetLastError:=True)> _
    Public Function GetProcAddress(ByVal hModule As IntPtr, ByVal procedureName As String) As IntPtr
    End Function

<DllImport("kernel32.dll", SetLastError:=True)> _
    Public Function FreeLibrary(ByVal hModule As IntPtr) As IntPtr
    End Function

End Module


<UnmanagedFunctionPointer(CallingConvention.StdCall)>
    Private Delegate Sub MYFUNC(ByVal LogonString As String, <MarshalAs(UnmanagedType.VBByRefStr)> ByRef PARAMONE As String, ByVal PARAMTWO As String)

Public Shared Sub CallFunction(ByRef workingObject As PLIOBJECT)
    Dim EntryPointer As IntPtr = NativeMethods.LoadLibrary("PLIDLL.dll")
    Dim FunctionPointer As IntPtr = NativeMethods.GetProcAddress(EntryPointer, "MYFUNC")
    Dim MyFUNC As MYFUNC= CType(Marshal.GetDelegateForFunctionPointer(FunctionPointer, GetType(MYFUNC)), MYFUNC)
    MyFUNC(workingObject.Logonstring, workingObject.PARAMONE, workingObject.PARAMTWO)
    Dim result As Boolean = NativeMethods.FreeLibrary(EntryPointer)

End Sub
于 2013-02-28T09:54:03.867 に答える