Comment envoyer des messages entre le c++ .dll et application en C# à l'aide de canal nommé?
Je suis en train de faire de l'injection .dll écrite en C++, et j'ai envie de communiquer avec une application en C# à l'aide de canaux nommés.
Maintenant, je suis en utilisant le construit dans le Système.IO.La Pipe .net classes de l'application en C#, et je suis en utilisant le régulier des fonctions en C++.
Je n'ai pas beaucoup d'expérience en C++ (Lire: C'est mon premier code C++..), même si je suis expérimenté en C#.
Il semble que la connexion avec le serveur et le client est au travail, le seul problème est la messaged ne sont pas envoyées. J'ai essayé de faire le .dll le serveur, l'application en C# le serveur, faire la pipe direction InOut (duplex) mais aucune ne semble fonctionner.
Quand j'ai essayé de faire de la .dll le serveur qui envoie des messages à l'application en C#, le code que j'ai utilisé était comme ceci:
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);
}
Et le C# cliend comme ceci:
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);
}
}
}
}
Je vois que le C# client connecté à l' .dll, mais il ne recevrez aucun message..
J'ai essayé de le faire dans l'autre sens, comme je l'ai dit avant, et essayer de faire le C# envoyer des messages à l' .dll, ce qui permettrait de les afficher dans une boîte de message.
L' .dll a été injecté et connecté au C# serveur, mais lorsqu'Il a reçu un message qu'il vient de tomber en panne de l'application qu'il a injectés.
Merci de m'aider, ou me guider sur la façon d'utiliser les canaux nommés entre C++ et C# app
Vous devez vous connecter pour publier un commentaire.
Quelques choses.
1 - Êtes-vous en utilisant le même nom de canal
C++ : "\\.\pipe\HyperPipe"
C# : "HyperPipe"
2 - je pense que sur le C#, côté il pourrait être préférable d'utiliser ReadToEnd(), j'ai seulement utilisé les canaux nommés en C++, mais je suppose que ReadToEnd() va lire un message depuis que vous êtes à l'aide de message
tuyaux.
3 - Sur le C++ côté, vous essayez d'utiliser la non-blocage des tuyaux et des bureaux de la conduite de raccordement et données, etc. Je voudrais suggérer une de trois choses.
La première option serait la plus facile et pour ce qu'il sonne comme vous le faites, il sera mis à l'échelle fine. Voici un lien vers un exemple simple (a)
http://msdn.microsoft.com/en-us/library/aa365588(SV.85).aspx
4 - assurez-vous que vos encodages match sur les deux côtés. Par exemple, si votre code C++ est compilé pour l'Unicode, vous devez lire le Tuyau de flux sur le C# en utilisant l'encodage Unicode.
Quelque chose comme ce qui suit.
Mise à jour: Puisque je n'avais pas travaillé avec ce en C# j'ai pensé que je pourrais écrire un petit test. Juste à l'aide de blocage des tuyaux pas de filetage ou de quoi que ce soit, juste pour confirmer les bases de travail, voici le très rude épreuve, code.
Serveur C++
Client C#