问题描述
各位大牛,新人求教~~目前的问题是:我在C#编写的主控端写了一个管道NamedPipeServerStreamserver=newNamedPipeServerStream("MyPipe",PipeDirection.InOut,1,PipeTransmissionMode.Byte,PipeOptions.Asynchronous,1204,1024);管道的客户端是一个底层的EXE程序,是用C++写的hNamedPipe=CreateFile(pPipeName,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);pPipeName=“MyPipe”;现在我已经在主控端和客户端成功的建立了一个管道,并且已经实现了通信不过我的主控端又调用了一个C++写的DLL函数,这个函数需要用我建立的这个管道向客户端发消息,所以我必须把我建的这个管道的标识符也就是句柄传给这个dll函数,这样这个函数才能用我建的这个管道实现通信,那么问题来了。。就是我怎么获得C#当中编写的管道的句柄值
解决方案
解决方案二:
好难啊,我还没学到
解决方案三:
先找c++程序员问问到底要什么“句柄”来读取命名管道?
解决方案四:
既然你“在C#编写的主控端写了一个管道”,那么你就在c#端再写一个真正可以使用这个管道的程序吧。那样等你真正搞懂了命名管道的概念,再跟所谓的c++程序员来谈接口问题,会更好。
解决方案五:
您好,谢谢您的回复,我这边的C++已经可以实现通信了,但是C++那边要求传过去一个句柄值,我在想是不是这个句柄值也就是这个管道的首地址值??我发现了一个这个类SafePipeHandle,说是可以返回server这个对象的句柄值,但是我又查了一下在c#调用C++的dll时C++中的参数handle与C#中的参数intptr是相对应的,所以我现在就在纠结这个safepipehandle怎么和intptr联系起来呢?谢谢赐教~!
解决方案六:
引用3楼sp1234的回复:
既然你“在C#编写的主控端写了一个管道”,那么你就在c#端再写一个真正可以使用这个管道的程序吧。那样等你真正搞懂了命名管道的概念,再跟所谓的c++程序员来谈接口问题,会更好。
您好,谢谢您的回复,我这边的C++已经可以实现通信了,但是C++那边要求传过去一个句柄值,我在想是不是这个句柄值也就是这个管道的首地址值??我发现了一个这个类SafePipeHandle,说是可以返回server这个对象的句柄值,但是我又查了一下在c#调用C++的dll时C++中的参数handle与C#中的参数intptr是相对应的,所以我现在就在纠结这个safepipehandle怎么和intptr联系起来呢?谢谢赐教~!
解决方案七:
解决方案八:
有意思,在Windows中进程中的句柄是独立的,换句话说,你把C#进程中的句柄0xaaaaaaaa,传递给C++进程,天知道在C++进程中0xaaaaaaaa指向的是个什么东西!但是,这就没办法了吗?有的,参考Windows进程中的句柄管理。
解决方案九:
不过目前我都还没处理到传句柄的那部分,我连C#这边的句柄都不知道怎么建,关键这是个管道的句柄,C#不像C++一样创建管道的时候就返回了一个句柄,我这还不知道C#创建管道怎么获得它的句柄值呢??不过还是谢谢LS的回复
解决方案十:
哈哈,已经知道怎么获得C#端的管道句柄啦,用safepipehandle.DangerousGetHandle()方法,可以返回一个intptr类型的句柄值
解决方案十一:
很久以前用过管道,不记得有这么复杂啊,关注。
解决方案十二:
引用10楼piaopiao_lucky的回复:
很久以前用过管道,不记得有这么复杂啊,关注。
是啊,单独C#和单独C++建管道不是很复杂,这俩要弄一块去就不知道咋搞了