Ich mache eine injizierte DLL, die in C++ geschrieben ist, und ich möchte mit einer C#-Anwendung über benannte Pipes kommunizieren.
Ich verwende die eingebauten System.IO.Pipe .net-Klassen in der C#-Anwendung und die regulären Funktionen in C++.
Ich habe nicht viel Erfahrung in C++ (Lesen: Dies ist mein erster C++-Code..), obwohl ich in C# erfahren bin.
Es scheint, dass die Verbindung mit dem Server und dem Client funktioniert, das einzige Problem ist, dass die Nachrichten nicht gesendet werden. Ich habe versucht, die .dll der Server, die C# app der Server, so dass die Rohrrichtung InOut (duplex), aber keiner scheint zu funktionieren.
Als ich versucht habe, die .dll zum Server zu machen, der Nachrichten an die C#-Anwendung sendet, war der verwendete Code wie folgt:
DWORD ServerCreate() // function to create the server and wait till it successfully creates it to return.
{
hPipe = CreateNamedPipe(pipename,//The unique pipe name. This string must have the following form: \\.\pipe\pipename
PIPE_ACCESS_DUPLEX,
PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_NOWAIT, //write and read and return right away
PIPE_UNLIMITED_INSTANCES,//The maximum number of instances that can be created for this pipe
4096 , // output time-out
4096 , // input time-out
0,//client time-out
NULL);
if(hPipe== INVALID_HANDLE_VALUE)
{
return 1;//failed
}
else
return 0;//success
}
void SendMsg(string msg)
{
DWORD cbWritten;
WriteFile(hPipe,msg.c_str(), msg.length()+1, &cbWritten,NULL);
}
void ProccesingPipeInstance()
{
while(ServerCreate() == 1)//if failed
{
Sleep(1000);
}
//if created success, wait to connect
ConnectNamedPipe(hPipe, NULL);
for(;;)
{
SendMsg("HI!");
if( ConnectNamedPipe(hPipe, NULL)==0)
if(GetLastError()==ERROR_NO_DATA)
{
DebugPrintA("previous closed,ERROR_NO_DATA");
DisconnectNamedPipe(hPipe);
ConnectNamedPipe(hPipe, NULL);
}
Sleep(1000);
}
Und der C#-Client wie folgt:
static void Main(string[] args)
{
Console.WriteLine("Hello!");
using (var pipe = new NamedPipeClientStream(".", "HyprPipe", PipeDirection.In))
{
Console.WriteLine("Created Client!");
Console.Write("Connecting to pipe server in the .dll ...");
pipe.Connect();
Console.WriteLine("DONE!");
using (var pr = new StreamReader(pipe))
{
string t;
while ((t = pr.ReadLine()) != null)
{
Console.WriteLine("Message: {0}",t);
}
}
}
}
Ich sehe, dass der C#-Client eine Verbindung zur .dll hergestellt hat, aber er empfängt keine Nachricht. Ich habe versucht, es andersherum zu tun, wie ich schon sagte, und versuchen, die C# Nachrichten an die .dll zu senden, die sie in einem Nachrichtenfeld anzeigen würde. Die .dll wurde injiziert und mit dem C#-Server verbunden, aber wenn es eine Nachricht erhielt, stürzte die Anwendung, in die es injiziert wurde, einfach ab.
Bitte helfen Sie mir, oder führen Sie mich auf, wie man benannte Rohre zwischen C++ und C# app verwenden