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

InformationsquelleAutor Gal | 2010-04-23