c++中
struct madx_stat {
char  msg[256];
size_t  write_size;
int is_eof;
size_t readsize;
size_t remaining; // Will reference some 
// "middle part" of in_buffer:
unsigned char  *buffstart;
};extern "C" __declspec(dllexport) madx_sig __stdcall 
madx_read ( unsigned char *in_buffer, 
unsigned char *out_buffer, madx_house *mxhouse, madx_stat *mxstat)
{
.........
//########################################3
mxstat->readsize =10;
mxstat->remaining = 10;
return(MORE_INPUT);
//###############################3
.....
}
C#中
[StructLayout(LayoutKind.Sequential, Size = 276), Serializable]
        public struct madx_stat
        {            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
            public string msg;
            public uint write_size;
            public int is_eof;
            public uint readsize;
            public uint remaining;
            public IntPtr buffstart;        }
        [DllImport("madxdllwm.dll")]
        public static extern madx_sig
        madx_read(IntPtr in_buffer,
            IntPtr out_buffer, IntPtr mx_house, ref madx_stat mxstat);调用:    mxSignal = Program.madx_read(inBufferPtr, outBufferPtr, mxHousePtr, ref mxStat);
在vs调试中发现我修改的两个值根本没有变化
又做测试,在c++中有代码
if (  (mxstat->readsize == 0)  && 
(mxstat->remaining == 0)  )
{...}
居然通不过,在调试器中可以看到readsize和remaining的值为0x00000000我的dll和c#程序都是在vs2008,windows mobile5的sdk中调试的。
谢谢各位

解决方案 »

  1.   

    readsize和remaining的值为0x00000000 
    证明为空嘛
      

  2.   

    把 ref去掉试试,c#中,对象传的本来就是指针
      

  3.   

    初始化是直接new出来的,我也尝试新建了一个初始化的函数,在dll里面给这两个变量赋值,没有用,
    还有这些代码是一个开源的项目里的,是win32中的,我移到mobile里出的问题。
      

  4.   

    加ref是没有错的,不加没有办法编译成功,而且msdn的例子里面就带的。
      

  5.   

    用法没错,我写了一个dll试了一下,可以修改成功