Post Print Search
帖子排序:    
帖子发起人: emeer   发起时间: 2007-08-28 15:45   回复: 1
emeer18361 离线,最后访问时间: 2007-8-29 10:34:40 emeer

发帖数前50位

注册: 2007-07-24
发贴: 6
Tongue Tied [:S] 试了网上copy最多的那个rapi的例子怎么也调不通,做过rapi的大侠来救我一救!
楼主  2007-08-28, 15:45 Reply Quote
做个pc与ppc传文件的程序,本来想用socket的,也成功了,但无法自动获得主机的ip,而要让别人手动输入,不太人性,于是想用rapi,网上看到关于这个最多的那篇文章,确实不错,但拿来试试却出现问题了代码如下:
using System;
using System.Runtime.InteropServices;

namespace RapiTest
{
public class RAPI
{

public RAPI()
{
int ret = CeRapiInit(); <----这个报错!
if( ret != 0)
{
// 连接失败,获取失败代码
int e = CeRapiGetError();
// 抛出异常

}
// 连接成功
// To Do

}
[DllImport("rapi.dll", CharSet=CharSet.Unicode)]
internal static extern int CeRapiGetError();
[DllImport("rapi.dll", CharSet=CharSet.Unicode)]
internal static extern int CeRapiInit();

}
}

以上是初始的



using System;
using System.Runtime.InteropServices;
using System.IO;

namespace RapiTest
{
public class RapiFile
{
private const uint GENERIC_WRITE = 0x40000000;
// 设置读写权限
private const short CREATE_NEW = 1;
// 创建新文件
private const short FILE_ATTRIBUTE_NORMAL = 0x80;
// 设置文件属性
private const short INVALID_HANDLE_VALUE = -1;
// 错误句柄
IntPtr remoteFile = IntPtr.Zero;
String LocalFileName = @"e:\t.txt";
// 本地计算机文件名
String RemoteFileName = @"\My Documents\test.txt";
// 远程设备文件名
byte[] buffer = new byte[0x1000];
// 传输缓冲区定义为4k
FileStream localFile;
int bytesread = 0;
int byteswritten = 0;
int filepos = 0;
public RapiFile()
{
// 创建远程文件
remoteFile = CeCreateFile(RemoteFileName, GENERIC_WRITE, 0, 0, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0);
// 检查文件是否创建成功
if ((int)remoteFile == INVALID_HANDLE_VALUE)
{
throw new Exception("Could not create remote file");
}
// 打开本地文件
localFile = new FileStream(LocalFileName, FileMode.Open);
// 读取4K字节
bytesread = localFile.Read(buffer, filepos, buffer.Length);
while(bytesread > 0)
{
// 移动文件指针到已读取的位置
filepos += bytesread;
// 写缓冲区数据到远程设备文件
if(! Convert.ToBoolean(CeWriteFile(remoteFile, buffer, bytesread, ref byteswritten, 0)))
{ // 检查是否成功,不成功关闭文件句柄,抛出异常
CeCloseHandle(remoteFile);
throw new Exception("Could not write to remote file");
}
try
{
// 重新填充本地缓冲区
bytesread = localFile.Read(buffer, 0, buffer.Length);
}
catch(Exception)
{
bytesread = 0;
}
}
// 关闭本地文件
localFile.Close();
// 关闭远程文件
CeCloseHandle(remoteFile);
}
// 声明要引用的API
[DllImport("rapi.dll", CharSet=CharSet.Unicode)]
internal static extern int CeCloseHandle(IntPtr hObject);
[DllImport("rapi.dll", CharSet=CharSet.Unicode)]
internal static extern int CeWriteFile(IntPtr hFile, byte[] lpBuffer, int nNumberOfbytesToWrite, ref int lpNumberOfbytesWritten, int lpOverlapped);
[DllImport("rapi.dll", CharSet=CharSet.Unicode, SetLastError=true)] internal static extern IntPtr CeCreateFile( string lpFileName, uint dwDesiredAccess, int dwShareMode, int lpSecurityAttributes, int dwCreationDisposition, int dwFlagsAndAttributes, int hTemplateFile);
}
}

以上copy文件


using System;
using System.Runtime.InteropServices;
namespace RapiTest
{
public class RAPIUninit
{
public RAPIUninit()
{
CeRapiUninit();
}
// 声明要引用的API
[DllImport("rapi.dll", CharSet=CharSet.Unicode)]
internal static extern int CeRapiUninit();
}
}

以上断开!

有做过rapi给小弟留个口信啊!谢谢

IP 地址: 已记录   报告
Eric 离线,最后访问时间: 2007-9-18 22:00:20 EricAdmin

发帖数前200位

注册: 2007-09-18
发贴: 2
Re: 试了网上copy最多的那个rapi的例子怎么也调不通,做过rapi的大侠来救我一救!
第2楼  2007-09-18, 21:21 Reply Quote
OpenNetCF的dll中有关于PC和PDA之间copy文件的,直接可以调用,该dll已经把rapi封装好了。请去下载使用。
IP 地址: 已记录   报告
Mobile应用开发 » 移动开发技术 » .NET Compact Fr... » 试了网上copy最多的那个rapi的例子怎么也调不通,做过rapi的大侠来救我一救!