你没帖出来,但我通过你说的
你说你的返回值都是false说明不是参数类型设置错误
而是参数的值设置错误!
你还是帖出来的好!

解决方案 »

  1.   

    对不起,现在才有时间,请指教
    API的原型如下:
    BOOL InternetReadFile( 
        HINTERNET hFile, 
        LPVOID lpBuffer, 
        DWORD dwNumberOfBytesToRead, 
        LPDWORD lpdwNumberOfBytesRead 
    );
    我C#中的调用形式是:
    [DllImport("WinINet.dll",EntryPoint="InternetReadFile",ExactSpelling=false, CharSet=CharSet.Ansi, SetLastError=true)]
    unsafe static extern bool InternetReadFile(IntPtr hFile,[MarshalAs(UnmanagedType.LPStr)]string lpbuffer,long BytesToRead,[MarshalAs(UnmanagedType.U8)] long bread);
      

  2.   

    hFile可以是是IntPtr没错,
    buffer不能用String代替,应该用StringBuilder或者byte[],如果是byte[],MarshalAs(UnmangedType.LPArray)。
    DWORD是32位的,对应于int/uint而不是long,
    最后一个参数是指针,应该用ref int,
    而且,整个函数声明不需要unsafe。前面已经有一个贴子再问了,用贴子提前不是更好?份在两处,给自己和别人都制造不方便。
      

  3.   

    真对不起,发第一贴后,一直有事,没来得及看
    多谢高手指点,问题已解决,多谢,多谢。
    可我还有点不明白,为什么API函数里参数同是LP字母开头的指针类型
    LPVOID lpBuffer用C#的byte[]LPDWORD lpdwNumberOfBytesRead用C#的ref int?
      

  4.   

    LPVOID == void*, 一般是用来传用其它参数指定长度或不定长的数组的LPDWORD == 单变量指针, 一般是用来传回单个值的