2013-02-27 108 views
0

我得到了一个PL/I DLL,我试图将该DLL导入到我的VB.Net应用程序中。 第一次尝试工作,但程序在几次呼叫后没有发表评论就退出了。 而且不可能从两个不同的线程调用这些函数两次。 我从paramone中的DLL中获得结果。任何想法为什么这不工作正确,以及如何让它工作?VB.Net DLLImport

<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:我已经尝试rerewrite的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);  
+0

解决了它被调用两次的问题。几次通话后,程序仍然退出。 – Lim 2013-02-27 13:56:03

+1

直到你展示界面的另一边,我们无法帮助你。显然你的界面是错误的。我没有见过与ByRef字符串匹配的东西。但如果我们不知道界面的另一面是什么,我们就不能告诉你什么是正确的。 – 2013-02-27 14:59:30

回答

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 
+0

我们如何评论?你只告诉我们一半的故事。答案中的代码与问题中的代码相同。除了每次打电话时库都装载和卸载。它隐藏了你的错误,而不是修复它。而且非常浪费。如果你会按照我的要求做,并显示界面的另一端,那么我们可以提供帮助。 – 2013-02-28 11:25:53

+0

@DavidHeffernan对不起,我很困惑接口的其他方面?我知道它几乎相同,它会浪费资源。 – Lim 2013-02-28 11:58:29

+0

该DLL在VB6中工作了多年,没有任何问题。程序本身并不包含比DLL调用更多的内容。所以请告诉我我应该发布什么,或者你的意思是“对方”。 – Lim 2013-02-28 12:20:49