我想实现在PC机上通过USB连接操作PDA上的文件。在网上找到了一些关于RAPI的使用资料,也下载到了OpenNETCF Desktop Communication Library的源码(下载地址:http://rapi.codeplex.com/releases/view/91052)。
但是发现常出现被CeRapiInit这个函数阻塞,无法进行下去,只能强行结束任务。
CeRapiInit是调用rapi.dll中的函数:
[DllImport("rapi.dll", CharSet = CharSet.Unicode)]
internal static extern int CeRapiInit();
为了中断这个进程,我用了个线程进行超时判断,有了点效果,但是在不退出程序前,只有前三次能正常进行文件传输,第四次时就会报N多错误。
另外,这个RAPI的Connect函数还有一个重载,就是Connect(false,2),第一个函数表示是否要等待连接成功才向下执行,第二个函数是连接不成功时尝试的次数。用这个重载虽然不会被阻塞,但却在传输文件时出现Could not create remote file错误。
问题不知是否描述清楚,期望得到各位帮助。
private int rapiinitresult = 0;
//这个是我定义线程要执行的内容
private void rapiinit()
{
rapiinitresult = CeRapiInit();
return;
}
public void Connect(bool WaitForInit, int TimeoutSeconds)
{
int ret = 0;
m_timeout = TimeoutSeconds;
if (WaitForInit)
{
//由于CeRapiInit会阻塞主线程,因此使用线程运行CeRapiInit,超过5秒后终止
rapiinitresult = 123456789;
Thread rth = new Thread(new ThreadStart(rapiinit));
rth.Start();
DateTime d = DateTime.Now.AddMilliseconds(5000);
while (rapiinitresult == 123456789)
{
if (d.CompareTo(DateTime.Now) <= 0 || m_killThread)
{
//rth.Join();
rth.Interrupt();
CeRapiUninit();
return;
}
}
ret = rapiinitresult;
//------------------------------------------------------------------
//ret = CeRapiInit();
if (ret != 0)
{
int e = CeRapiGetError();
Marshal.ThrowExceptionForHR(ret);
}
lock (thisLock)
{
m_connected = true;
}
// throw the connected event
OnRAPIConnected();
return;
}
// non-blocking init call
m_ri = new RAPIINIT();
m_ri.cbSize = Marshal.SizeOf(m_ri);
ret = CeRapiInitEx(ref m_ri);
if (ret != 0)
{
Marshal.ThrowExceptionForHR(ret);
}
m_hInitEvent = m_ri.heRapiInit;
// create a wait thread
m_initThread = new Thread(new ThreadStart(InitThreadProc));
// Start thread
m_initThread.Start();
}
------解决思路----------------------
放在嵌入式开发-WINCE板块更合适哦~
出现“could not create...”可能是由于路径不对或者路径下已有重名文件造成的,不一定是代码逻辑问题~
------解决思路----------------------
activesync有没有安装好?连接是否正常?运行rapi自带的例子可以否?
------解决思路----------------------
activesync有可能停止工作的,看看你在PC端能不能打开PDA的文件夹
------解决思路----------------------
可以去看看我在 CSDN 的两篇博文:
http://blog.csdn.net/91program/article/details/7561939
和
http://blog.csdn.net/91program/article/details/3175646
都是经过测试的,如果还不行,就不是对 RAPI 调用的问题,而是环境的问题。
------解决思路----------------------
用socket实现TCP通信可能更简单。不过好像只能pc作为服务器。