void CALLBACK funGetOrignalFrame(long nPort,FRAME_TYPE *frameType, long nUser)
{
CcomboDlg* pOwner=(CcomboDlg*)nUser;
DWORD nRet;
if (bFirstWrite )
{
newFile = CreateFile(pOwner->m_strPlayFileName,
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
bFirstWrite = FALSE;//第一次写入完成后把指针移到文件末尾
SetFilePointer(newFile,0 ,NULL,FILE_END); 
}
WriteFile(newFile,frameType->pDataBuf,frameType->nSize,&nRet,NULL);
Sleep(1);
}以上这段C++代码是一个回调函数中的,我需要将它转成C#的,有谁能帮忙转下,//Frame 
typedef struct{
char *pDataBuf;
long  nSize;
long  nFrameNum;
BOOL  bIsAudio;
long  nReserved;
}FRAME_TYPE;上面是FrameType的定义
这个回调函数是用来创建一个新文件的。
其中在C#中定义FrameType为
public struct FRAME_TYPE
    {
        /// <summary>
        /// 数据帧首地址
        /// char *pDataBuf; 
        /// </summary>
        public string pDataBuf;//2009-12-31Jerry
        /// <summary>
        /// 数据帧的大小 
        /// long nSize; 
        /// </summary>
        public int nSize;
        /// <summary>
        /// 数据帧的个数
        /// long nFrameNum;  
        /// </summary>
        public int nFrameNum;
        /// <summary>
        /// 是否音频帧
        /// BOOL bIsAudio;   
        /// </summary>
        public bool bIsAudio;
        /// <summary>
        /// 保留
        /// 
        /// long nReserved; 
        /// </summary>
        public int nReserved;
    }以下是回调函数的原型说明,可参考下:#region
回调函数原型说明:
void(CALLBACK *funGetOrignalFrame)(long nPort,FRAME_TYPE *frameType, long nUser)
nPort 通道号
*frameType 有关数据帧的信息
typedef struct{
char *pDataBuf; 数据帧首地址
long nSize; 数据帧的大小
long nFrameNum; 数据帧的个数
BOOL bIsAudio; 是否音频帧
long nReserved; 保留
}FRAME_TYPE;
nUser 用户数据
#endregion

解决方案 »

  1.   

           /// <summary>
            /// 数据帧首地址
            /// char *pDataBuf; 
            /// </summary>
            public string pDataBuf;//2009-12-31Jerry
    这里改为stringbuilder;然后对齐方式要与C++的一致;;
    回调函数的形式写成委托的形式就行了,没有什么区别,
    关键在结构的声明那里。。
      

  2.   

    首先声明一个委托
    delegate void funGetOrignalFrame(long nPort,FRAME_TYPE *frameType, long nUser);然后把委托当作回调使用就可以了PS:C#中的struct好像是值类型,只能做输入参数。
      

  3.   

    楼上两位兄弟,你们说的我都做了,现在只差回调函数里面的创建文件没做,
    二楼的,char *转成c#时,用string也是可以的,我测试过了。
    现在是想吧回调函数里面的内容转成C#的,其他不用了
      

  4.   

    比如C++中那个WriteFile函数怎么换成C#的,用FileStream行吗,WriteFile里面会用到char *pDataBuf; 数据帧首地址
    C#中怎么处理这个?
      

  5.   

    FileStream就可以了,C#中一般文件写入的是byte数组
    如果写入2进制也可以用BinaryWriter类C#字符串转byte数组:
    byte[] XX = Encoding.UTF8.GetBytes(string); 
      

  6.   

        CcomboDlg* pOwner=(CcomboDlg*)nUser;
        DWORD nRet;
        if (bFirstWrite )
        {
            newFile = CreateFile(pOwner->m_strPlayFileName,
                GENERIC_READ|GENERIC_WRITE,
                FILE_SHARE_WRITE,
                NULL,
                OPEN_EXISTING,
                FILE_ATTRIBUTE_NORMAL,
                NULL);
            bFirstWrite = FALSE;//第一次写入完成后把指针移到文件末尾
            SetFilePointer(newFile,0 ,NULL,FILE_END); 
        }
        WriteFile(newFile,frameType->pDataBuf,frameType->nSize,&nRet,NULL);
        Sleep(1);
    第一次调用,创建文件,第二次以后调用,就直接写入,然后sleep(1)就行了呀没有什么难度的;
      

  7.   

    你需要在C++中看一下CcomboDlg::m_strPlayFileName是什么类型,在类中的相对偏移量是多少,然后在C#中定义一个结构与其对应。
    函数中的代码可以调用API,也可以用其它方式替代,只要能实现其功能即可。
      

  8.   

    转的时候功能一样就可以了,不一定回调就用委托,他有结构,也搞个结构和他一样
    关键是搞懂他从哪取数据,加了什么工,放到哪里去
    然后C#也去那取数据,同样的算法进行加工,放到该放的地方去
    比如数据结构的链表,C/C++用个指针来指向下一个结点,那在C#实现也要用指针?准备的来说是用C#语言去实现C++实现的某一功能,具体怎么实现,就没必要一一对应了
      

  9.   

    楼上几位,先谢了~~
    不过你们说的那些我已经都实现了的回调函数也已经能够正常执行了的~~
    就差回调函数里面的内容。
    就是循环--第一次创建文件--之后往文件尾加数据
    C++中使用WriteFile,参数是数据的地址,这些转到C#就不太熟,不知道C#中对应于WriteFile的方法是什么
    呵呵,我还是自己转转先
      

  10.   

    FileStream就可以,用Seek设置到末尾,用Write写。