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

return をGet_Receivedata()fromStringからObjector 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 に答える