看过很多blog,也各种搜集链接,但是想好好的整理一下自己的开发历程,就打算开博写东西,空了把以前的项目问题搬上来。

2015.11.04 这是一个值得纪念的日子。

问题描述:

目前正在着手弄一个android 平板用数据线连接的问题,怎么实现连接先搁置一下,谈一下这两天想破头的问题。

正式由于平板的插拔问题,为了反正意外的掉线问题,必须时刻保持对设备与主机连接状态的检测,所以我希望通过pc端定时获取当前连接的便携设备。

历程: 最开始的时候,我不知道当前用的平板是便携设备,以为通过简单的usb 插拔消息句柄可以控制,然后获取C#中用 driverInfo 封装好的设备信息。

后来在各种更改driverType后仍然检测不到已经插好的android 平板,遂通过设备管理器查看才知道其显示为便携设备,并不具备盘符,无法通过driverInfo获取。

然后又在各种百度下,才知道便携设备的检测需要用到 Windows PortableDeviceApi.  既然有api是肯定好的,但是问题总是一堆一堆的。

首先网上相关的资料不算太多,同时微软msdn文档中用的是C++的方法,并不满足我的需求。后来才找到几个链接接近我的想法。http://blog.csdn.net/yu0zhuo/article/details/5728605/、、、、、、、http://blogs.msdn.com/b/dimeby8/archive/2006/12/05/enumerating-wpd-devices-in-c.aspx

本来想直接使用第一个链接中的代码,无奈编译出错,主要问题出在 devMgr.GetDevices(strPnPDeviceIDs, ref cDevices)这个方法中,官方api第一个参数类型为 string,

而代码中为string[],显然这是不匹配的,但是又不知道怎么解决,遂科普到第二个链接,由于英文水平不太好的问题,折腾半天才看到

Mike R. brought to my notice that the above sample only enumerates one device even if more than one are connected. This is a marshalling restriction - we can work around it by manually fixing up the generated Interop assembly. Follow the steps below to edit the assembly:

  1. Disassemble the PortableDeviceApi interop using the command -
    ildasm Interop.PortableDeviceApiLib.dll /out:pdapi.il
  2. Open the IL in Notepad and search for the following string
    instance void  GetDevices([in][out] string&  marshal( lpwstr) pPnPDeviceIDs,
  3. Replace all instances of the string above with the following string
    instance void  GetDevices([in][out] string[]  marshal([]) pPnPDeviceIDs,
  4. Save the IL and reassemble the interop using the command -
    ilasm pdapi.il /dll /output=Interop.PortableDeviceApiLib.dll

You can now rebuild your project. You can now first call GetDevices with a NULL parameter to get the count of devices and then call it again with an array to get the device IDs.

这是在告诉我们,使用官方原定的api有局限性,不支持 string[] 那个类型的参数,需要我们手工改动PortableDeviceApiLib的dll文件,修改其中的方法  GetDevices([in][out] string[]  marshal([]) pPnPDeviceIDs)

关键之处:先把原来的PortableDeviceApiLib.dll用(ILDASM)反编译,得到PortableDeviceApiLib.il ,然后修改文中的代码:

修改方式为 将文件中的instance void  GetDevices([in][out] string&  marshal( lpwstr) pPnPDeviceIDs  替换为

instance void  GetDevices([in][out] string[]  marshal([]) pPnPDeviceIDs,

然后回到程序界面,编译问题消失,貌似得以解决。

再然后,问题又来了,当调试程序时,爆出了另一个错误 Marshaler restriction: Excessively long string.

这个问题使得程序执行到getDevice时终止。又各种查阅,才知道参数依旧不匹配,继续修改参数

修改方式为:将文件中的instance void  GetDevices([in][out] string&  marshal( lpwstr) pPnPDeviceIDs 

替换为 instance void  GetDevices([in][out] string[]  marshal(lpwstr) pPnPDeviceIDs,

目前的问题初步得到解决。


C#连接android时,pc端检测便携设备PortableDeviceApi调用的问题相关推荐

  1. android 自动备份到局域网,Android和PC端通过局域网文件同步

    本文为大家分享了Android和PC端通过局域网文件同步的具体代码,供大家参考,具体内容如下 public class FileOptions { public String name; public ...

  2. Android 防止PC端第三方流氓软件强制安装apk至android设备

    今天,研究了一下PC端软件连接设备(android)后,强制安装应用程序到设备端,比如某60,某讯等,最后被我活生生禁掉了,折服于我的PMS之下,欲知如何禁之,且听下文分解: 软件平台:Android ...

  3. JS判断是苹果系统(ios)还是安卓系统(Android)或者PC端

    前言 今天看到一道面试题,JS判断是否是苹果系统(ios)和安卓系统(Android)客户端,一下就涉及到自己的知识盲区,赶紧亡羊补牢一下.顺便在拓展一下是pc还是移动端?pc端的话,又是在什么浏览器 ...

  4. pc端vue登录如何调用软键盘_使用vue实现简单键盘的示例(支持移动端和pc端)

    常看到各种app应用中使用自定义的键盘,本例子中使用vue2实现个简单的键盘,支持在移动端和PC端使用 实现效果: Keyboard.vue 123 符 · {{key}} import clicko ...

  5. android连接不上socket,关于socket通信的android与pc端连接,为什么我定义的socket是为空的,连接不上pc端...

    服务器端代码: package mytable; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; im ...

  6. 从Android访问PC端的port (reverse port forwarding)

    2019独角兽企业重金招聘Python工程师标准>>> 大致就是 Device side: install SSH Server, add ssh server on 22222 p ...

  7. 向日葵android比pc端慢很多,向日葵远程控制Android主控端9.5上线,交互流畅性全面升级...

    近日,向日葵发布全新移动端版本--向日葵远程控制Android主控端9.5版本.该版本对界面模块进行了调整,新增会心攻略模块,优化交互模式,提升按键宽容度,打造远控游戏的完美体验. 新增会心攻略,提供 ...

  8. pc端vue登录如何调用软键盘_vue-自定义pc端软键盘

    ! @ # $ % ^ & * ( ) { } : " , / {{item}} {{item}} {{item}} delete space 7 8 9 4 5 6 1 2 3 0 ...

  9. 【无人机学习】Mission Planner(pc端)和QGroundControl(android端)

    █ [无人机学习]Mission Planner(pc端)和QGroundControl(android端) █ 系列文章目录 提示:这里是收集了无人机的相关文章 [无人机学习]无人机基础知识 [无人 ...

最新文章

  1. Python包、模块、类以及遇到的问题
  2. 配置策略路由(PBR)
  3. POJ 1017 Packets【贪心】
  4. NASA公布“门户计划”,在月球轨道建立空间站进一步探索月球
  5. [html] 一般习惯把js写在</body>前,但有例外的情况吗?说说看
  6. ubuntu7.10中的apache的一些设置
  7. php gis,对php代码混淆的研究
  8. PHP模板引擎Smarty概述
  9. [bzoj5301][Cqoi2018]异或序列
  10. 分寸:切记别把话说得太死 — 《别输在不会表达上》
  11. Visual Studio各组件说明
  12. 文字表情 emoji 解析大全
  13. 矩阵分析之 伪逆矩阵,左逆,右逆,广义逆
  14. 图 网络 关联矩阵
  15. 数学管理联考-无限循环小数如何转化为分数
  16. c++基础题:判断某整数是正整数、负整数还是零
  17. 字符串类型的数字的加减乘除运算
  18. iOS App无需跳转系统设置自动连接Wi-Fi
  19. pdf口令安全性破解
  20. NGUI用onSelect检测(监听)Input 控件失焦(非选中状态)

热门文章

  1. 计算机学院舍徽,关于举办山东工商学院第十七届心理健康宣传月活动的通知
  2. android弹框 简书,Android -自定义弹框
  3. 我们注视的,是相同的世界吗
  4. 天气微信小程序源码,附上线教程
  5. MATLAB R2016a 安装教程
  6. Transactional
  7. MiniUI 的知识积累
  8. 几行代码的播放器源代码——是真的能播放的
  9. Window thin PC的安装与汉化
  10. 最近找实习的笔试面试经历