0

我有一个 PL/I Dll,我正在尝试将 DLL 导入到我的 VB.Net 应用程序中。第一次尝试成功,但在几次调用后,程序确实退出了,没有发表评论。并且不可能从两个不同的线程两次调用这些函数。我从 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:我已经尝试重写 PL/I 代码,以便它返回一个字符串而不是 ByRef 值。同样的问题。

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 回答