2016-09-01 2 views
1

Ich bin verwirrt ... Ich bin ein VB.net Programmierer und ich muss eine Schnittstelle mit einem Empfänger erstellen. Senden von Daten an den Empfänger ist kein Problem, ich kann die Frequenz, Bandbreite und solche Sachen programmieren ... Ich bin verpflichtet, C++ zu verwenden, um mit dem Empfänger zu sprechen. Also habe ich beschlossen, es zu versuchen und eine DLL in C++ zu erstellen und die GUI in VB.net zu erstellen. Allerdings, wenn ich Informationen von dem Empfänger fragen will, ich stecken geblieben ...Dll in C++ 2013 muss eine Zeichenfolge an VB.net zurückgeben

Meine C++ Code wie folgt aussieht

char __stdcall Q_BW(){ 
    MyPR100::sendSCPI(TCPsock, "SENS:BAND?\n"); 
    char pRxBuf[256]; 
    int len = recv(TCPsock, pRxBuf, sizeof(pRxBuf), 0); 
    if (len < 0) len = 0; pRxBuf[len] = '\0'; 
    puts(pRxBuf); 
    return pRxBuf; 
} 

Also im Grunde, einen Befehl an den Empfänger zu senden, und setzen das Ergebnis in ein Puffer ... jetzt muss dieser Puffer zu VB.net zurückgebracht werden und hier versage ich ... Wenn ich kompiliere, habe ich den Fehler

Konversion von 'char [256]' zu 'char '

Ich kann sehen, was ich falsch mache, aber anscheinend bin ich nicht in der Lage, eine Lösung für diese zu finden ... Die DLL in Ordnung für Daten an den Empfänger zu senden funktioniert, so dass ein Teil arbeitet, ist ... abgeschlossen sein, dann ist dies der Code VB.net ...

Private Declare Function Q_BW Lib "PR100Dll.dll"() As String 

Dim Res As String = "" 
Res = Q_BW() 
MsgBox(Res, MsgBoxStyle.Information) 

Ich weiß, dass dies eine Anfängerfrage sein könnte, aber ich bin wirklich fest hier ... Da ich nicht so gut bin (was eine Uterpretation ist) in C++, und Englisch ist nicht meine Muttersprache, würde ich mich freuen, wenn ich habe eine nicht so schwierige antwort, wo ich davon lernen kann ... Ach, bitte notiere mir das ich seit 2 wochen jetzt gegoogelt habe und dass ich wirklich am ende bin ...

danke im voraus ...

+0

Ein 'String' in VB.NET gehört zu einem [BSTR] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms221069.aspx) in nicht verwaltetem Code. Sofern Sie nicht UTF-16-codierte Zeichen in Ihrem 'recv'-Aufruf lesen, müssen Sie die Daten in UTF-16 konvertieren. – IInspectable

+0

'char __stdcall Q_BW()' gibt einen einzelnen Zeichen, keine Zeichenfolge zurück. Auch für die Interaktion mit VB benötigen Sie einen 'bstr_t', der sich komplett von einem' char * 'oder' std :: string' unterscheidet. –

+0

Kann ich bitte einige Beispiele haben? das wäre sehr erfreulich .... – Ben

Antwort

1

Ich schrieb ein Beispiel für Sie:

1.TestDll.cpp (Die Funktion in DLL)

#include "stdafx.h" 

char* __stdcall ReadString() 
{ 
    return "ABCDEFG"; 
} 

2.TestDll.def (die Readstring-Funktion Export)

LIBRARY  TestDll 
EXPORTS 
    ReadString 

3. TestCS (CSharp Demo)

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.InteropServices; 
using System.Text; 
using System.Threading.Tasks; 

namespace TestCS 
{ 
    class Program 
    { 
     [DllImport("TestDll.dll", CallingConvention = CallingConvention.StdCall)] 
     private static extern IntPtr ReadString(); 

     static void Main(string[] args) 
     { 
      IntPtr t = ReadString(); 
      String result = Marshal.PtrToStringAnsi(t); 
     } 
    } 
} 

4.TestVB (VB Demo)

Sie sollten den gleichen Zeichensatz in Dll-Projekt und CS-Projekt und VB-Projekt festlegen.

+0

Sie sind fantastisch ... heute war ich krank und blieb von der Arbeit zu Hause, aber ich werde es versuchen Montags! Danke für das klare Beispiel. Jetzt kann ich etwas tiefer graben. – Ben

Verwandte Themen