DLL Problem // Kominkation 2 Programme

  • VB.NET

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von marwo.

    DLL Problem // Kominkation 2 Programme

    ich brächte mal euere Hilfe .

    Mein Ziel ist es Programm übergreifend Nachrichten zu senden.Programme: 2 x Metatrader 4 und 1x vb.net Programm .
    Senden und empfangen zwischen Metatrder 4 geht einwandfrei.Senden von vb.net zu Metatreader 4 geht.
    Empfangen mit vb.net geht nicht .

    Bekomme immer 0 wen ich den Buffer auslese :(


    Benutze hierzu die FXBlueQuickChannel.dll von Fx blue.

    Link: fxblue.com/appstore/9/quickchannel

    User Guid : fxblue.com/appstore/u9/quickchannel/user-guide

    danke für euerer Hilfe.

    Metatrader4 Sender: Sprache: mq4

    VB.NET-Quellcode

    1. #import "FXBlueQuickChannel.dll"
    2. int QC_StartSenderW(string);
    3. int QC_ReleaseSender(int);
    4. int QC_SendMessageW(int, string&, int);
    5. bool eins = false;
    6. #import
    7. int glbHandle = 0;
    8. void OnInit()
    9. {
    10. glbHandle = QC_StartSenderW("TestChannel");
    11. Alert(glbHandle);
    12. }
    13. void OnDeinit(const int reason)
    14. {
    15. QC_ReleaseSender(glbHandle);
    16. glbHandle = 0;
    17. }
    18. void OnTick()
    19. {
    20. //ms();
    21. }
    22. void ms ()
    23. {
    24. if(eins==false){
    25. eins = false;
    26. string strMsg = "Hello @ 2" ;
    27. if (!QC_SendMessageW(glbHandle, strMsg , 3)) {
    28. Alert("Message failed");
    29. }
    30. }
    31. }


    Empfänger Metatrader4. Sprachen mq4

    VB.NET-Quellcode

    1. #import "FXBlueQuickChannel.dll"
    2. int QC_StartReceiverW(string, int);
    3. int QC_ReleaseReceiver(int);
    4. int QC_GetMessages5W(int, uchar&[], int);
    5. int QC_CheckChannel(string);
    6. int QC_CheckChannel (string);
    7. string a;
    8. string b;
    9. string c;
    10. #import
    11. #define QC_BUFFER_SIZE 10000
    12. int glbHandle = 0;
    13. uchar glbBuffer[]; // Allocated on initialisation
    14. void OnInit()
    15. {
    16. // Do initialisation in OnTick (or OnStart), not in OnInit()
    17. }
    18. void OnDeinit(const int reason)
    19. {
    20. if (glbHandle) QC_ReleaseReceiver(glbHandle);
    21. glbHandle = 0;
    22. }
    23. void OnTick()
    24. {
    25. // Create handle and buffer if not already done (i.e. on first tick)
    26. if (!glbHandle) {
    27. glbHandle = QC_StartReceiverW("TestChannel", WindowHandle(Symbol(), Period()));
    28. ArrayResize(glbBuffer, QC_BUFFER_SIZE);
    29. }
    30. if (glbHandle) {
    31. int res = QC_GetMessages5W(glbHandle, glbBuffer, QC_BUFFER_SIZE);
    32. if (res > 0) {
    33. string strMsg = CharArrayToString(glbBuffer, 0, res);
    34. int zz;
    35. zz = strMsg;
    36. Alert(strMsg);
    37. }
    38. } else {
    39. Print("No handle");
    40. }
    41. }
    42. void test()
    43. {
    44. }



    Nun zu VB.net code

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Public Class Form1
    3. <DllImport("FXBlueQuickChannel.dll", CharSet:=CharSet.Unicode)>
    4. Public Shared Function QC_StartSenderW(ByVal ChannelName As String) As Integer
    5. End Function
    6. <DllImport("FXBlueQuickChannel.dll", CharSet:=CharSet.Unicode)>
    7. Public Shared Function QC_SendMessageW(ChannelHandle As Integer, Msg As String, Flags As Integer) As Integer
    8. End Function
    9. <DllImport("FXBlueQuickChannel.dll")>
    10. Public Shared Function QC_ReleaseSender(CannelHandle As IntPtr) As Integer
    11. End Function
    12. <DllImport("FXBlueQuickChannel.dll", CharSet:=CharSet.Unicode)>
    13. Public Shared Function QC_StartReceiverW(ByVal ChannelName As String, ChannelHandle As IntPtr) As IntPtr
    14. End Function
    15. <DllImport("FXBlueQuickChannel.dll")>
    16. Public Shared Function QC_ReleaseReceiver(ByVal ChannelHandle As IntPtr) As Integer
    17. End Function
    18. <DllImport("FXBlueQuickChannel.dll")>
    19. Public Shared Function QC_GetMessage5W(ByVal ChannelHandle As Long, ByVal Buffer As String, ByVal BufferSize As Long) As String
    20. End Function
    21. <DllImport("FXBlueQuickChannel.dll")>
    22. Public Shared Function QC_StartReceiver(ByVal ChannelName As String, ByVal WindowHandle As Long) As Long
    23. End Function
    24. <DllImport("FXBlueQuickChannel.dll")>
    25. Public Shared Function QC_GetMessage2W(ByVal Channelhandel As Integer) As String
    26. End Function


    Der Sender:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. glbHandle = QC_StartSenderW("TestChannel")
    3. MsgBox(glbHandle)
    4. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    5. Dim Buy As String = "OrderSend(Symbol(),OP_BUY,0.01,Ask,1,0,0,NULL,0,0,clrGreen)"
    6. QC_SendMessageW(glbHandle, Buy, 3)
    7. End Sub
    8. End Sub



    Der Empfänger vb.net


    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim a
    3. a = QC_StartReceiverW("Testcanel", 1)
    4. TextBox1.Text = a.ToString
    5. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    6. Dim Buffer As String
    7. Dim szBuffer As Long
    8. Dim Res As Long
    9. Dim qchandle
    10. qchandle = QC_StartReceiver("TestChannel", 1)
    11. szBuffer = 100000
    12. Buffer = Space$(szBuffer + 1)
    13. Res = QC_GetMessage5W(qchandle, Buffer, szBuffer)
    14. If Res > 0 Then
    15. Dim strResult As String
    16. strResult = Buffer & " " & Res
    17. TextBox1.Text = strResult
    18. ElseIf Res = 0 Then
    19. ' No messages
    20. Else
    21. ' Error, e.g. buffer too short
    22. End If
    23. End Sub
    24. End Sub



    Über Hilfe wäre ich sehr Dankbar. weis nicht weiter

    BG
    @marwo Vielleicht gugst Du mal hier rein: Austausch von Daten zwischen einer VB.NET-exe und einer C-DLL, 32 und 64 Bit
    Kommen die Daten in der C++-DLL an?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    marwo schrieb:

    neu einstellen
    solltest Du öfters.
    Arbeitest Du sowohl mit C++ als auch mit C#?
    Wenn ja, kannst Du beide Projekte in eine Projektmappe packen und gemeinsam debuggen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @marwo OK.
    Das bedeutet ggf. dass die Deklarationen Deiner Prozeduren ggf. nicht korrekt sind, da musst Du mal ein wenig rumspielen.
    Nimm den Link in Post #2 als Anhaltspunkt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @marwo Probiere alle (nicht funktionierenden) Prozeduren einzeln durch, bis sie laufen.
    Zuerst musst Du natürlich die DLL initialisieren.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @marwo Ich sehe ByVal ChannelHandle As Long und ByVal ChannelHandle As Integer, da ist gewiss eines von beiden falsch, ByVal WindowHandle As Long ebenso.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Moin ich habe mir das ganze nochmal angeschaut. habe etwas abgeändert.

    Jetzt wird es komisch.

    Der Sender ist nicht gestartet es heist also es wurden keine Nachrichten gesendet .

    wen ich nun mit VB.net nachrichten abrufe . Bekomme ich leeren Buffer.

    Wen ich eine Nachricht sende bekomme ich in vb.net das selbe Ergebnis. leren Buffer angezeigt.






    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Public Class Form1
    3. Declare Function QC_StartSender Lib "FXBlueQuickChannel.dll" (ByVal ChannelName As String) As Long
    4. Declare Function QC_ReleaseSender Lib "FXBlueQuickChannel.dll" (ByVal ChannelHandle As Long) As Long
    5. Declare Function QC_SendMessage Lib "FXBlueQuickChannel.dll" (ByVal ChannelHandle As Long, ByVal Message As String, ByVal Flags As Long) As Long
    6. Declare Function QC_StartReceiver Lib "FXBlueQuickChannel.dll" (ByVal ChannelName As String, ByVal WindowHandle As Long) As Long
    7. Declare Function QC_ReleaseReceiver Lib "FXBlueQuickChannel.dll" (ByVal ChannelHandle As Long) As Long
    8. Declare Function QC_GetMessages5W Lib "FXBlueQuickChannel.dll" (ByVal ChannelHandle As Long, ByVal Buffer As String, ByVal BufferSize As Long) As Long
    9. Declare Function QC_CheckChannel Lib "FXBlueQuickChannel.dll" (ByVal ChannelName As String) As Long
    10. Declare Function QC_ChannelHasReceiver Lib "FXBlueQuickChannel.dll" (ByVal ChannelName As String) As Long
    11. Dim glbHandle = 0
    12. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    13. glbHandle = QC_StartSender("TestChannel")
    14. MsgBox(glbHandle)
    15. End Sub
    16. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    17. Dim a
    18. 'QC_ReleaseSender(1)
    19. a = QC_StartReceiver("Testcanel", 1)
    20. TextBox1.Text = a.ToString
    21. End Sub
    22. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    23. Dim strMsg As String = "Heelo VB"
    24. QC_SendMessage(glbHandle, strMsg, 3)
    25. Dim Buy As String = "OrderSend(Symbol(),OP_BUY,0.01,Ask,1,0,0,NULL,0,0,clrGreen)"
    26. QC_SendMessage(glbHandle, Buy, 3)
    27. End Sub
    28. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    29. Dim neuerthread As System.Threading.Thread
    30. neuerthread = New System.Threading.Thread(AddressOf Me.en)
    31. neuerthread.Start()
    32. End Sub
    33. Sub en()
    34. Dim Buffer As String
    35. Dim szBuffer As Long
    36. Dim Res As Long
    37. Dim qchandle
    38. qchandle = QC_StartReceiver("TestChannel", 1)
    39. szBuffer = 100000
    40. Buffer = Space$(szBuffer + 1)
    41. Res = QC_GetMessages5W(qchandle, Buffer, szBuffer)
    42. If Res > 0 Then
    43. Dim strResult As String
    44. strResult = Buffer & "Buffer ende" & Res & "ende"
    45. TextBox1.Invoke(Sub()
    46. TextBox1.Text = strResult
    47. End Sub)
    48. ElseIf Res = 0 Then
    49. MsgBox("0000")
    50. Else
    51. ' Error, e.g. buffer too short
    52. End If
    53. End Sub
    54. Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    55. If m.Msg = 1024 AndAlso m.WParam.ToInt32() = 1234 AndAlso m.LParam.ToInt32() = 5678 Then
    56. Else
    57. MyBase.WndProc(m)
    58. End If
    59. End Sub
    60. End Class


    @marwo Ist denn der Sender beim Senden gestartet oder nicht?
    Die Long-Parameter finde ich komisch.
    Kommt bei keiner dieser Prozeduren eine StackImbalanceException?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @marwo Es gibt da ne 32-Bit- und ne 64-Bit-Variante:
    Spoiler anzeigen

    32 Bit schrieb:

    #import "FXBlueQuickChannel.dll"
    int QC_StartSenderW(string);
    int QC_ReleaseSender(int);
    int QC_SendMessageW(int, string, int);
    int QC_StartReceiverW(string, int);
    int QC_ReleaseReceiver(int);
    int QC_GetMessages5W(int, uchar&[], int);
    int QC_CheckChannelW(string);
    int QC_ChannelHasReceiverW(string);
    #import

    64 Bit schrieb:

    #import "FXBlueQuickChannel64.dll"
    long QC_StartSenderW(string);
    int QC_ReleaseSender(long);
    int QC_SendMessageW(long, string, int);
    long QC_StartReceiverW(string, long);
    int QC_ReleaseReceiver(long);
    int QC_GetMessages5W(long, uchar&[], int);
    int QC_CheckChannelW(string);
    int QC_ChannelHasReceiverW(string);
    #import
    Da solltest Du noch mal gaaaaaaanz genau nachsehen, was an Parametern Integer bzw. Long ist.
    Das Senden und Empfangen ist ja letzten Endes je nur ein Dreizeiler.
    Hast Du eine Gegenstelle, mit der Du Dich "unterhalten" kannst?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi,

    danke das du dir die Zeit nimmst.
    Also Ich Kann Zwischen 2 Metatreder 4 kommunizieren.

    Ich kann von Vb.net zu Metatreader Nachricht hin Senden. Aber ich kann keine nachrichten mit Vb.net empfangen.

    was ich kommisch finde ist. Wen ich nur das vb.net Programm starte und den Channel Teste , sagt er immer das er da ist. Obwohl er nie erstellt wurde.

    BG

    BG ich schaue es mit noch mal an
    @marwo Was genau brauche ich, um Deinen Effekt zu reproduzieren (Hardware, Software, Gegenstelle)?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @marwo Stell mal ein Bundel zusammen (Dein bereinigtes Projekt, DLLs usw.), pack alles in eine ZIP und hänge die an, wenn das nicht zu groß wird.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!