当前位置: 代码迷 >> WinCE >> PC机操作PDA中的文件,求教,该怎么解决
  详细解决方案

PC机操作PDA中的文件,求教,该怎么解决

热度:121   发布时间:2016-04-28 11:55:05.0
PC机操作PDA中的文件,求教
本帖最后由 msd88 于 2014-12-12 20:32:11 编辑
我想实现在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作为服务器。
  相关解决方案