vb.net调用vc++写的dll的问题

时间:2021-10-27 14:03:36
我是个vb.net新手,最近写一个医院管理系统,其中需要调用医保接口,我们这里的医保是东软的,只提供了动态库方式连接,并且提供了文档,但并未提供其他语言调用的DEMO,文档中是这样写的:
1.2 BUSINESS_HANDLE 业务函数
1.2.1 语法规则 Syntax:
对外提供接口:
SiInterface.dll
int WINAPI BUSINESS_HANDLE(const char* inputData,
                                 char* outputData)
输入参数:inputData  
输出参数:outputData char* 
返回值: 成功 0    失败 -1    
输入参数是以“^、$、|”分割的字符串
输出也是以“^”“@、^、$、|”分割的字符串
我在调用DLL的时候是这样写的:

Public Class DLLImports
    <DllImport("SiInterface.dll", EntryPoint:="INIT")> Public Shared Function INIT(ByVal OutputInfo As String) As Integer

    End Function
    <DllImport("SiInterface.dll", EntryPoint:="BUSINESS_HANDLE")> Public Shared Function BUSINESS_HANDLE(ByVal inputData As String, <Out> ByVal outputData As String) As Integer

    End Function
End Class

在程序中测试调用DLL中的函数是这样写的:

  Dim inputdata As String
            Dim l_outputdata As String
            Dim result As Integer
           
            inputdata = "9100^H129^0037^^2007010^^|^"
            l_outputdata = Space(100)
            result = BUSINESS_HANDLE(inputdata, l_outputdata)
            If result <> 0 Then
                System.Console.WriteLine("医保返回值:" & l_outputdata)
            End If

            System.Console.WriteLine("返回值:" & result)


现在出现的问题是这样的: 在调用这个动态库中的函数的时候会有一个输出的日志,调用时可以正常运行,但是调用BUSINESS_HANDLE(const char* inputData,  char* outputData)函数中的输出参数的时候,不能正确显示出输出参数中的内容,我 不知道是我调用的方法不对还是怎样?请各位高手指点一下!谢谢!

5 个解决方案

#2


引用 楼主 yushihai 的回复:
我是个vb.net新手,最近写一个医院管理系统,其中需要调用医保接口,我们这里的医保是东软的,只提供了动态库方式连接,并且提供了文档,但并未提供其他语言调用的DEMO,文档中是这样写的:
1.2 BUSINESS_HANDLE 业务函数
1.2.1 语法规则 Syntax:
对外提供接口:
SiInterface.dll
int WINAPI BUSINESS_HANDLE(const char* inputData,
                                 char* outputData)
输入参数:inputData  
输出参数:outputData char* 
返回值: 成功 0    失败 -1    
输入参数是以“^、$、|”分割的字符串
输出也是以“^”“@、^、$、|”分割的字符串
我在调用DLL的时候是这样写的:

Public Class DLLImports
    <DllImport("SiInterface.dll", EntryPoint:="INIT")> Public Shared Function INIT(ByVal OutputInfo As String) As Integer

    End Function
    <DllImport("SiInterface.dll", EntryPoint:="BUSINESS_HANDLE")> Public Shared Function BUSINESS_HANDLE(ByVal inputData As String, <Out> ByVal outputData As String) As Integer

    End Function
End Class

在程序中测试调用DLL中的函数是这样写的:

  Dim inputdata As String
            Dim l_outputdata As String
            Dim result As Integer
           
            inputdata = "9100^H129^0037^^2007010^^|^"
            l_outputdata = Space(100)
            result = BUSINESS_HANDLE(inputdata, l_outputdata)
            If result <> 0 Then
                System.Console.WriteLine("医保返回值:" & l_outputdata)
            End If

            System.Console.WriteLine("返回值:" & result)


现在出现的问题是这样的: 在调用这个动态库中的函数的时候会有一个输出的日志,调用时可以正常运行,但是调用BUSINESS_HANDLE(const char* inputData,  char* outputData)函数中的输出参数的时候,不能正确显示出输出参数中的内容,我 不知道是我调用的方法不对还是怎样?请各位高手指点一下!谢谢!

补充一点:outputdata是输出参数,即当调用dll中BUSINESS_HANDLE(const char* inputData,  char* outputData)函数完成后,这个函数不但会返回一个integer的整数,还会封装一个字符串通过outputData返回,我现在是想调用outputData里的值

#3


同问:

楼主会了吗,有时间贴出来呗。我也在做这个,调用C++写的dll,我用的是vb.net2010

#4


引用 3 楼 guangzi8531 的回复:
同问:

楼主会了吗,有时间贴出来呗。我也在做这个,调用C++写的dll,我用的是vb.net2010


正常函数的返回值是没问题的,只是这个函数里有一个传出参数,不知道怎么调用这个传出函数

#5


引用 3 楼 guangzi8531 的回复:
同问:

楼主会了吗,有时间贴出来呗。我也在做这个,调用C++写的dll,我用的是vb.net2010


已经解决了,虽然楼上的各位没能解决,但是十分感谢!应3楼要求,贴出我的代码:
调用Dll文件,需要注意的是要导入System.Runtime.InteropServices和System.Text:

   <DllImport("SiInterface.dll", EntryPoint:="INIT")> Public Shared Function INIT(ByVal OutputInfo As String) As Integer

    End Function
    <DllImport("SiInterface.dll", EntryPoint:="BUSINESS_HANDLE")> Public Shared Function BUSINESS_HANDLE(ByVal inputData As String, <Out> ByVal outputData As StringBuilder) As Integer

    End Function

调用DLL中函数,并读取函数中的传出函数代码:
 

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Try
            Dim inputdata As String
            ' Dim l_outputdata As String
            Dim l_outputdata As New Stringbuilder()
            Dim result As Integer
            '  l_outputdata = Nothing
            inputdata = Space(10240)
            inputdata = "9100^H129^0037^^2007010^^|^"
            l_outputdata.Capacity = 1024
            System.Console.WriteLine("输入值:" & inputdata)
            result = BUSINESS_HANDLE(inputdata, l_outputdata)
            If result <> 0 Then
                System.Console.WriteLine("医保返回值:" & l_outputdata.ToString())
            End If

            System.Console.WriteLine("返回值:" & result)
        Catch ex As Exception
            MessageBox.Show(ex.ToString())
        End Try

    End Sub

运行结果:
输入值:9100^H129^0037^^2007010^^|^
医保返回值:^^执行EapAgent_SendRequest()时错误.请检查网络连接状况!^
返回值:-4

#1


#2


引用 楼主 yushihai 的回复:
我是个vb.net新手,最近写一个医院管理系统,其中需要调用医保接口,我们这里的医保是东软的,只提供了动态库方式连接,并且提供了文档,但并未提供其他语言调用的DEMO,文档中是这样写的:
1.2 BUSINESS_HANDLE 业务函数
1.2.1 语法规则 Syntax:
对外提供接口:
SiInterface.dll
int WINAPI BUSINESS_HANDLE(const char* inputData,
                                 char* outputData)
输入参数:inputData  
输出参数:outputData char* 
返回值: 成功 0    失败 -1    
输入参数是以“^、$、|”分割的字符串
输出也是以“^”“@、^、$、|”分割的字符串
我在调用DLL的时候是这样写的:

Public Class DLLImports
    <DllImport("SiInterface.dll", EntryPoint:="INIT")> Public Shared Function INIT(ByVal OutputInfo As String) As Integer

    End Function
    <DllImport("SiInterface.dll", EntryPoint:="BUSINESS_HANDLE")> Public Shared Function BUSINESS_HANDLE(ByVal inputData As String, <Out> ByVal outputData As String) As Integer

    End Function
End Class

在程序中测试调用DLL中的函数是这样写的:

  Dim inputdata As String
            Dim l_outputdata As String
            Dim result As Integer
           
            inputdata = "9100^H129^0037^^2007010^^|^"
            l_outputdata = Space(100)
            result = BUSINESS_HANDLE(inputdata, l_outputdata)
            If result <> 0 Then
                System.Console.WriteLine("医保返回值:" & l_outputdata)
            End If

            System.Console.WriteLine("返回值:" & result)


现在出现的问题是这样的: 在调用这个动态库中的函数的时候会有一个输出的日志,调用时可以正常运行,但是调用BUSINESS_HANDLE(const char* inputData,  char* outputData)函数中的输出参数的时候,不能正确显示出输出参数中的内容,我 不知道是我调用的方法不对还是怎样?请各位高手指点一下!谢谢!

补充一点:outputdata是输出参数,即当调用dll中BUSINESS_HANDLE(const char* inputData,  char* outputData)函数完成后,这个函数不但会返回一个integer的整数,还会封装一个字符串通过outputData返回,我现在是想调用outputData里的值

#3


同问:

楼主会了吗,有时间贴出来呗。我也在做这个,调用C++写的dll,我用的是vb.net2010

#4


引用 3 楼 guangzi8531 的回复:
同问:

楼主会了吗,有时间贴出来呗。我也在做这个,调用C++写的dll,我用的是vb.net2010


正常函数的返回值是没问题的,只是这个函数里有一个传出参数,不知道怎么调用这个传出函数

#5


引用 3 楼 guangzi8531 的回复:
同问:

楼主会了吗,有时间贴出来呗。我也在做这个,调用C++写的dll,我用的是vb.net2010


已经解决了,虽然楼上的各位没能解决,但是十分感谢!应3楼要求,贴出我的代码:
调用Dll文件,需要注意的是要导入System.Runtime.InteropServices和System.Text:

   <DllImport("SiInterface.dll", EntryPoint:="INIT")> Public Shared Function INIT(ByVal OutputInfo As String) As Integer

    End Function
    <DllImport("SiInterface.dll", EntryPoint:="BUSINESS_HANDLE")> Public Shared Function BUSINESS_HANDLE(ByVal inputData As String, <Out> ByVal outputData As StringBuilder) As Integer

    End Function

调用DLL中函数,并读取函数中的传出函数代码:
 

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Try
            Dim inputdata As String
            ' Dim l_outputdata As String
            Dim l_outputdata As New Stringbuilder()
            Dim result As Integer
            '  l_outputdata = Nothing
            inputdata = Space(10240)
            inputdata = "9100^H129^0037^^2007010^^|^"
            l_outputdata.Capacity = 1024
            System.Console.WriteLine("输入值:" & inputdata)
            result = BUSINESS_HANDLE(inputdata, l_outputdata)
            If result <> 0 Then
                System.Console.WriteLine("医保返回值:" & l_outputdata.ToString())
            End If

            System.Console.WriteLine("返回值:" & result)
        Catch ex As Exception
            MessageBox.Show(ex.ToString())
        End Try

    End Sub

运行结果:
输入值:9100^H129^0037^^2007010^^|^
医保返回值:^^执行EapAgent_SendRequest()时错误.请检查网络连接状况!^
返回值:-4