0

char *从用 C 编写的 dll 函数读取 a 时出现问题。

DLL 称为 rapdll.dll。它的头文件看起来像:

extern "C"{void _stdcall New_Rapdll(void);}  
extern "C"{void _stdcall TCP_Set_RelayIO(char *Ipaddress,char *SerialNumber,char *Password,char *Data);}  
extern "C"{Variant _stdcall Get_Receivedata(void);}  

我没有 DLL 的源代码。我遇到问题的命令的帮助文件 (Get_Receivedata()) 是:

宣言

Char * Get_Receivedata(void)                                

例子:

Get_Receivedata ()  

返回值:

See Response from RAP: Success  
Data empty: Fail  
Description:  
This function is getting response from RAP.

到目前为止我写的代码是:

Public Class Form1  
Declare Sub TCP_Set_RelayIO Lib "rapdll.dll" (ByVal Ipaddress As String, ByVal Serial As String, ByVal Pass As String, ByVal Relay As String)  
Declare Sub TCP_Get_SerialNumber Lib "rapdll.dll" (ByVal Ipaddress As String, ByVal Pass As String)  
Declare Sub New_Rapdll Lib "rapdll.dll" ()  
Declare Function Get_Receivedata Lib "rapdll.dll" () As String  
Dim Result As String  


Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
End Sub

Function rap() As String
    Result = Get_Receivedata()
    Return Result
End Function

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim st As String
    Call New_Rapdll()
    Call TCP_Set_RelayIO("192.168.1.2", "0000", "0000", "00120")
    st = rap()
    MsgBox(st)

    End
End Sub
End Class  

一切正常,直到st = rap()行。它之前的命令“Call TCP_Set_RelayIO("192.168.1.2", "0000", "0000", "00120")" 工作正常,因为它确实重置了此设备中的继电器。但是当我尝试使用该Get_Receivedata函数阅读回复时,我得到了一个“System.AccessViolationException”类型的未处理异常。

我知道问题是试图char *从函数中读取返回Get_Receivedata值,但我不确定如何正确执行此操作。

谢谢你的帮助!

4

2 回答 2

0

尝试将返回值从Get_Receivedata()from更改StringObjector Variant(以及您的 Result 变量)。你也可以试试Byte数组。如果它停止了崩溃,您可能只需要找出返回的字节分解,并可能做一个Type或做一些CopyMemory()诡计。

于 2013-08-07T17:35:07.397 回答
0

这看起来不对(Variant):

extern "C"{Variant _stdcall Get_Receivedata(void);}  

无论如何,我真的建议您改用参数。像这样的东西...

C++:

extern "C"{void _stdcall Get_Receivedata(char** data);}

VB:

Declare Function Get_Receivedata Lib "rapdll.dll" (ByRef Data As String)
于 2013-08-05T15:45:20.700 回答