读书人

D和C++的文件数据共享有关问题

发布时间: 2012-02-23 22:01:35 作者: rapoo

D和C++的文件数据共享问题
一段代码:
DELPHI 代码录入一段WAV(音频),交由C++编写的DLL处理:
流程:录音到内存--存为WAV--调用DLL(C++)--C++中打开WAV文件--C++中处理数据--返回结果到DELPHI

希望:直接Delphi中将内存中的数据直接传给C++,可能吗?给个方案。
或者 最好不通过磁盘传递WAV文件数据


[解决办法]
其实,你的问题麻烦的不是内存内容的传递,而是WAV格式的保存,你之所以要保存到文件中,估计也是为了形成这个WAV格式的文件。
不直到你是通过什么方式保存到文件中的,如果是流的方式,他应该除了有个SaveToFile的函数外,还应该有个SaveToStream的调用,你声明一个ms: TMemoryStream流,然后把录制的内容保存到ms中,然后将
ms.Memory和ms.Size两个参数传个DLL就可以了。
至于DLL向回传递,那就看DLL有没有能力在内存中保存出来一个WAV格式的数据流了,如果能,直接把指针传递回来就可以了。如果DLL对数据的处理不会超出ms.Size大小,你完全可以把数据在写入到ms.Memory指向的内存并把处理后的大小传回来
[解决办法]
不通过磁盘,就通过内存映射了,比较方便,c++内存映射过程如下:
HANDLE file;
LPVOID buf;
file=OpenFileMapping(FILE_MAP_ALL_ACCESS,NULL,"ywjxyz");
if(file==NULL)
{
file=CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,50,"ywjxyz");
buf=MapViewOfFile(file,FILE_MAP_ALL_ACCESS,0,0,0);
cout<<"写数据\n";
strcpy((char *)buf,a);
}
else
{
buf=MapViewOfFile(file,FILE_MAP_ALL_ACCESS,0,0,0);
cout<<"读数据\n";
cout<<(char *)buf;
}
UnmapViewOfFile( buf);
CloseHandle(file);
另外,也可以通过socket或剪贴板来实现共享啊。
但我认为内存映射比较好。

读书人网 >.NET

热点推荐