问题标签 [handheld]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
9454 浏览

compact-framework - 如何确定我的设备上安装的 Compact Framework 的版本?

看起来可以解决我最近在尝试整理各种设备上不同版本的 CF 以便它们都可以运行我的 CE/CF 应用程序时的手忙脚乱和头疼的问题。这些扭动可以在这里这里阅读。

该链接显示了一种为旧版本的 CF 构建的应用程序在安装了新版本的设备上运行的方法。但它说:

“要确定 Pocket PC 上当前安装的版本,请使用文件资源管理器导航到 \Windows 目录并点击 cgacutil 文件。将出现一个消息框,其中包含设备上安装的 .NET Compact Framework 版本。”

但是,Windows 资源管理器(我的 Motorola 3190 设备上没有“文件资源管理器”)在 Windows 文件夹中没有显示“cgacutil”。文件夹的文件居民从“ceconfig”变为“charset”,它们之间没有“cg*”。

上面链接的 URL 还说:

“将应用程序设置为在 3.5 版上运行 确定设备上运行的 .NET Compact Framework 的版本号。”

我怎样才能确定呢?一旦我知道了,我应该可以在手持设备中添加一个名为 [appName].exe.config 的文件,其中所有数据都将是彩虹炖菜/大冰糖山:

但是“v3.5.7000”实际上应该是什么?我需要知道如何确定该版本值。

在系统属性中,我可以看到一些操作系统信息,但看不到 CF 版本。例如,我看到:

微软视窗 CE 版本 6.00

更新

四处寻找,我注意到设备上有一个名为“Microsoft .NET CF 2.0.LOG.TXT”的文件

文件名表示安装的 CF 版本 IS 2.0

因此,由于在其他设备上运行的 .exe 似乎是 CF 1,我可以将其用作 [appName].exe.config 文件的内容(文件中的内容更具体地说明版本号):

那会有帮助吗?

更新 2

文件“Microsoft .NET CF 2.0.LOG 文件包含一些有趣的信息:

所以新设备同时安装了 2.0.7045.0 和 3.5.7283.0 版本。

根据运行Windows\cgacutil.exe时显示的内容,旧设备已安装1.0.3316.00。

有问题的项目将框架版本设置为“v2.0”

旧设备在旧设备上运行,但不在新设备上运行......???

新版本的源代码都不会在任何一个上运行。由于它针对的是框架版本 2.0,我现在明白为什么新版本无法在旧设备上运行。但为什么不在新的呢?它安装了 CF 2,对应于项目所针对的框架版本...

更新 3

我将文件 [appName].exe.config 复制到手持设备,与 .exe 位于同一文件夹中

这是较新的(摩托罗拉 3190)设备,据说安装了 CF 版本 2.* 和 3.5*。

尝试运行旧版(据说是为 CF 1.0* 构建的)exe 确实与那里的 exe.config 文件表现不同。我得到的不是永恒的沙漏,而是:

所以它告诉我联系自己,这没有多大用处。

为什么文本文件显示我安装了 v2.0.7045.00,而这表明我没有安装它?

更新 4

文本文件指示版本 2.* 已安装在设备上,但尝试在那里运行最新版本(其中“v2.0”作为“框架版本”属性)无法运行,这对我来说真的很可怕/令人沮丧。没有 bla.exe.config 文件的沙漏,与上面的错误消息一起失败......?!?

更新 5

我还将应用程序的最新版本(针对框架版本 2)复制到旧设备(安装了框架 1 的设备)。我在那里添加了一个 [appName].exe.config 和 .exe,其中包含以下内容:

...但是尝试运行 .exe 只会导致短暂的沙漏 - 没有错误消息,但也没有快乐。

更新 6

进一步试验,我采用了相反问题的项目(框架版本是 v3.5,可以在较新的设备上运行,但不能在较旧的设备上运行),并编辑了它的 .csproj 文件,<TargetFrameworkVersion>从“v3.5”()到“v2.0”(我首先尝试将其更改为“v1.0”,但收到错误消息:“此项目需要.NET Compact Framework v1.0,未安装在此机器上。 ”所以将其更改为“ v1.0”到“v2.0”

但是,这并没有帮助-该构建也无法在(较旧的)手持设备上运行...

不过,错误消息告诉我,我以前从未需要创建框架版本 1.0 构建,因为我的开发机器上什至没有它(但我之前构建了确实在两者上都运行的旧应用程序的版本设备)。因此,设备本身似乎被“弄乱了”(Compact Framework 的新版本已被旧版本取代)。

更新 7

注意:在通过 .csproj 文件将框架版本从“v3.5”更改为“v2.0”后,在较新设备上运行的小型 .exe/实用程序仍然有效

更新 8

为了进一步澄清(混淆?)发生了什么:

3090 Symbol 手持设备已安装 CF 版本 1.0.3316.00(根据 Windows\cgacutil.exe)

3190 摩托罗拉手持设备没有 Windows\cgacutil.exe,但有一个文件指示其上安装了 Compact Framework 的“2.0.7045.00”和“3.5.7338.00”两个版本

由已故开发人员在现已失效的机器上构建的最后一个 exe 仅在 3090 上运行。它以 CF 框架 1 为目标,大概是(因为它在安装了该版本 CF 的设备上运行)

情况很奇怪,因为在他离开之前,我们通过 TFS 共享代码,我能够在设备上运行组合代码的结果 (.exe),他也是。

来自我的源代码的最新构建编译/构建,但既不在 3090 也不在 3190 上运行。它针对 CF 框架版本 2.0

我构建的一个简约实用程序仅在 3190 上运行。它针对 CF 框架版本 2.0

这一切是否给任何人一个线索?

更新 9

在下面 IowaEric 的回答中引用的这个站点上,它说:“.NET Compact Framework 在每个设备上安装了一个名为 cgacutil.exe 的实用程序。”

我在一台设备上看到了该文件 (cgacutil.exe),但在另一台设备上却没有。

上面的链接还说,“在 Pocket PC 或 Smartphone 设备上,您可以使用文件资源管理器”

...但我也没有看到“文件资源管理器”应用程序[let];我有 Windows 资源管理器...???

更新 10

啊哈!如该链接中所述,转到开始>运行...> cgacutil确实有效。它告诉我“... [3.5.7283.0, 2.0.7045.0]”

(在 3190 上;在 3090 上显示“1.0.3316.00”)

更新 11

所以这就是我能够确定设备上的内容:

0 投票
0 回答
1390 浏览

sql-server-ce - 当 SDF 文件和设备看似相同的版本 (2) 时,我应该调用“SqlCeEngine.Upgrade()”吗?

这是对这里的一个问题的跟进

ctacke 说关于我曾经/正在遇到的与 SQL Server CE 相关的“问题”:

"如错误文本所示,问题在于 SDF 文件是由与应用程序引用的 SQL Compact 版本不匹配的 SQL Compact 版本创建的。我不会关注报告的版本号, 只是它知道存在不匹配的事实。如果您不知道 SDF 的版本,您总是可以通过从 SDF 文件中读取几个字节来查找它。SQL Compact 数据库文件不是 100% 可传输的。您绝对不能从较新版本中获取 SDF 并使用较旧的运行时集加载它。如果数据库是使用 3.1 创建的,则可以通过调用 SqlCeEngine.Upgrade() 将其升级到 3.5。 "

我现在知道有问题的 .SDF 文件是 2.0 版

那么我应该在代码中的某处使用“SqlCeEngine.Upgrade()”技术吗?

根据 C++ 设置实用程序代码,两个设备(3090 和 3190,但我现在正在测试 3190)都应该安装 SQLCE 2:

....虽然我在设备上的任何地方都找不到任何“SQLCE”文件...

更新

在实例化 SqlCeEngine 后,我添加了对 Upgrade() 的调用:

...这可能是一件好事,因为现在 err msg 是不同的,也就是说:

位置:DBConnection.DBConnection

例外:为源数据库指定的密码不正确 [Data Source = \My Documents\HHSDB.SDF]

内部异常:[空白]

类型全名:System.Data.SqlServerCe.SqlCeException

StackTrace:处理结果,修复...

将其与此处更新 4 中的情况进行比较(现在是密码问题;以前似乎是 Sql Ce 版本不匹配问题)。

好的,所以旧代码(以前有效)似乎没有添加密码。密码通常是如何“附加”的(我什至不知道密码应该是什么)?有没有办法让它不期待密码?

这是 DBConnection 实例化代码,它可能会对此有所了解:

以前使用的 GetDataPath(),它被分配给文件名调用,但现在因为文件名被覆盖而没有实际意义,它很简单:

更新 2

这是否足以解决我的问题,只需将“ Persist Security Info=False; ”附加到连接字符串,a la:

? IOW,是否附加了一种说法,“忘记密码,我不依赖它们”?

我还注意到上面的示例(来自此处)在“Source”和“=”之间以及“=”和 SDF 文件的路径之间没有空格。这不重要吗(我怀疑- IOW,任何一种方式都应该有效)?

不过,也许更重要的是,我的连接字符串以重击(“Data Source = \My Documents”)开头,而这个不是。重要的?

根据同一个站点,如果我确实需要密码,我认为它会是这样的:

...或者...???

更新 3

Altho ctacke 说驾驶室安装并不真正相关,为了完整起见/为了后代,我添加了一些关于设备设置差异的注释:

那些标有星号的 cab 文件与其他设备的安装不同

3090通过设置实用程序安装了 8 个出租车:

3190通过设置实用程序安装了 8 个 cab(设置实用程序中的注释说,“ MC3190 在默认配置中包含 .NET 3.5 ”):

所以

3090 具有独特的:

3190 具有独特的:

两者都升级到:

(为什么这些“升级驾驶室”没有简单地添加到各自的安装列表中,我不知道 - 是否有“升级”选项?)

更新 4

受到 ctacke 最新评论的启发(激怒、刺激),我仔细查看了我的应用程序中的 SQL CE 引用,它看起来像是混合和匹配的腐烂药水:

也许这个女巫酿造至少与我的问题有关。

更新 5

所以,我想,这肯定是我在这里看到的弗兰肯斯坦和德古拉之间的某种交叉。这些相关文件必须全部存在于同一位置。所以我查看了所有这些并发现了这一点:

说不是这样!事情真的是这样吗?我必须从这里获取这个文件,从那里获取那个文件,等等?

更新 6

针对 ctacke 的评论:

"您所引用的 SQL CE 版本必须与设备上的版本相匹配。我无法告诉您应该是什么,只是它们必须相同,并且它们应该与创建的次要版本相匹配数据库文件

我在设备上根本看不到 SqlServerCe.dll;有一个名为“Computer\Clay's Device\\Program Files\Microsoft SQL Server Compact Edition\v3.5”的文件夹,其中包含以下 DLL:

(全部创建于 2010 年 2 月 12 日)

设备上还有一个文件夹“Computer\Clay's Device\\Windows\SQLCE 2.0”,其中包含日期为 2002 年 8 月 16 日和 2002 年 8 月 28 日的文件:

我假设最后两个用于显示错误消息,我假设最后一个用于日语,我认为我们没有任何日本客户(当然没有日语应用程序的本地化版本),所以这很好莫名其妙的。

所以手持设备上根本没有 SqlServerCe.dll,所以版本之间不可能发生冲突——除非 SqlServerCe.dll 存在于某处但不可见?

更新 7

作为更新 5 的后续行动并为了完整起见(前两个 DLL 文件可能“无趣”):

我在整个硬盘驱动器中搜索了三个文件:

System.Data.dll被发现,除了上面提到的,在:

System.Data.SqlClient.dll被发现,除了上面提到的,在几个地方,但它们的大小都一样,除了:

System.Data.SqlServerCe.dll被发现,除了上面提到的(C:\Program Files (x86)\Microsoft SQL Server Compact Edition\v3.5\Devices),在:

也在:

-and in(与上面相同,但在 Program Files 文件夹中没有“(x86)”):

0 投票
1 回答
942 浏览

sql-server-ce - 我需要在我的项目中引用哪个 SqlServerCe DLL 版本以匹配 sqlce.wce4.armv4.CAB 中的内容?

下面讲述了“故事的其余部分”的所有血腥细节,但切入正题,归结为:

SQLCE 2.0(包含在 sqlce.wce4.armv4.CAB 中)似乎安装在我的应用程序运行的设备上;源项目引用运行时版本为 v2.0.50727 和版本为 3.5.1.0 的 SqlServerCe

这是匹配还是不匹配?如果是后者,我需要在我的项目中引用哪个版本的 SqlServerCe.dll?

血腥故事的其余部分

我的 Windows CE 应用程序在尝试打开 SQL CE (.SDF) 文件时失败;尽管一个潜在的早期问题显然与版本控制有关(没有双关语)(调用 SqlCeEngine.Upgrade() 让我过去了),错误消息现在表明密码问题。看到这个

但是我看不到在表上设置密码的位置 - 也看不到指定 SQLCE 版本的位置。

我们有一个安装实用程序,可以在手持设备上安装此应用程序以及必要的辅助文件。为了弄清楚这两个应用程序(正确的安装应用程序)在版本控制和密码方面到底做了什么,我在两个代码库中搜索了“SDF”和“SQLCE”,这是我发现的*:

设置实用程序中对“SDF”的唯一引用是:

应用程序本身中对“SDF”的唯一引用不会创建SqlCe(“SDF”)数据库。如果确实存在此类引用,它们会查找已存在的特定 SDF 文件,如下所示:

然后引擎数据库引擎被实例化和升级,并有条件地创建一个数据库(在我的例子中,文件存在,所以不调用 CreateDatabase()):

安装实用程序中对“SQLCE”的唯一引用是:

0)

1)

2)

应用程序本身对“SQLCE”的引用会创建或查询 SDF 表,例如:

注意:DBConnection 是一个自定义类,其中包含一些 SqlCe* 成员:

...因此,实用程序和应用程序本身似乎都没有创建SqlCe数据库(HHSDB.SDF) - 应用程序只需找到 .SDF 文件,然后从中读取/写入。

似乎当应用程序创建一个表(如上面的 CreateSettingsTable() )和类似活动时,它会使用 SqlCe DLL 来执行此操作,并且由于 ctacke 说该 DLL 的版本(设备上的那个)有与项目源代码相关的那个,实际上应该在设备上有一个,但是由于我在设备上没有看到任何SqlCe DLL,因此无法验证设备上的版本和项目构建环境是否匹配。 ..

具体来说:设备上没有sqlserverce.dll;是我应该寻找的其他文件吗?缺少此 DLL 本身一定不是问题,否则我将无法通过以下代码(我会这样做):

项目中引用的 System.Data.SqlServerCe DLL 为 Runtime Version "v2.0.50727", Version "3.5.1.0"

安装项目没有这样的引用,AFAICT(它是一个 C++ 项目)。但是,它确实有以下代码:

所以它为 SQL CE 版本 2 安装 cab 文件...这里的版本 2 是否与应用程序引用的 SqlServerCE DLL 中的“运行时版本”或“版本”相对应?

我认为这些 cab 应该被扩展/包含 SqlCe DLL [s] 但是,正如我所写的,在运行这个 setup util 之后我在设备上看不到任何东西(这似乎工作正常)。

所以,总结和重申:

SQLCE 2.0(包含在 sqlce.wce4.armv4.CAB 中)似乎安装在我的应用程序运行的设备上;源项目引用运行时版本为 v2.0.50727 和版本为 3.5.1.0 的 SqlServerCe

这是匹配还是不匹配?如果是后者,我需要在我的项目中引用哪个版本的 SqlServerCe.dll?

  • “入境口岸的警察说……” - 对不起,我忍不住(或者不想更喜欢它)

更新

这些是设备上的一些文件:

在此处输入图像描述

更新 2

尽管如此,表面上很明显,根据文件名,这些是 3.5 版,我在 JetBrains 的 dotPeek 中打开它们以试图验证这一点,但结果平淡无奇 - 我得到这些 DLL 的“(不支持)”。

在 Reflector 中尝试同样的事情给了我更多信息:“'C:\Bla\sqlceca35.dll' 不是 .NET 模块。”

0 投票
1 回答
638 浏览

pdf - 在 Windows Mobile 6.5 中打印 .pdf 文件

我最近买了一台摩托罗拉 MC9190 手持设备和一台 Zebra P4T 打印机。摩托罗拉有一个 Windows Mobile 6.5 版本。我的问题是我想打印 .pdf 文件,但任何应用程序都可以做到。我安装了 PrintBoy v7,但转换 .pdf 文件的服务服务器已关闭,此外,我安装了 ActivePrint Traveler,但该应用程序无法检查我的注册。

任何人都可以解决我的问题?我只想用我的打印机打印 .pdf 文件。

谢谢!

0 投票
1 回答
59 浏览

winforms - 如何防止我的表单在“活动”时垂直拉伸?

我的表单在设计时看起来很漂亮(YMMV):

在此处输入图像描述

...但是在设备上运行时会垂直“拉伸”,事实上,对于屏幕来说有点太高了:

在此处输入图像描述

为什么会发生这种情况,我该如何防止它发生?

可能值得注意:Form 的 WindowState == Normal,FormBorderStyle = FixedDialog

0 投票
1 回答
2667 浏览

compact-framework - 为什么发送到 Zebra QLn220 打印机的 CPCL 代码可以工作,而相同的代码在发送到 Zebra QL220 时不能工作?

根据用户偏好(选择的标签类型,以及是否发送“Keep Alive”消息),不同的 CPCL 命令从手持设备发送到 Zebra QL[n]220 带式打印机。这段代码:

...适用于(较新的)QLn220 打印机,但在(较旧的)QL220 上,不是打印机接收命令并对其进行操作,它只是将原始命令打印到标签上。IOW QL220 带式打印机不是将命令转换为操作或条形码,而是直接在标签上打印如下内容:

是 QL220 和 QLn220 之间的 CPCL 协议发生了变化,还是……?

更新

好吧,这很奇怪;奇怪的是,我添加了这段代码:

...尽管对 GetSettingFromPrinter() 的调用返回一个空字符串(如 MessageBox.Show 中所示),但打印结果仍然可以按需要工作(它根据需要打印标签,而不仅仅是将原始命令打印到它们上面)! ?

更新 2

注意:我的 QLn220 Zebra 打印机确实有一个 USB 端口(导致问题的旧 QL220 没有)。当我使用 Zebra Setup Utils 向它发送“您使用什么语言”(getDeviceLang) 命令时,它回复为“hybrid_xml_zpl”

0 投票
1 回答
621 浏览

windows-ce - Zebra QL220 和 QLn220 打印机是否需要设置为不同的设备语言?

我的 QLn220 打印机设置为“hybrid_xml_zpl”并且工作正常(我可以向它发送 CPCL 命令,它会按照我希望的方式打印标签)。

不过,我的 QL220 打印机(旧型号)更古怪。它有时会打印我发送给它的原始命令(未翻译),而不是按原样查看命令。我不知道那台打印机的 device.languages 设置是什么,因为它没有连接到 PC 的 USB 端口(如果有,我可以运行 Zebra Setup Utilities,发送它“!U1 getvar "device.languages" "(这就是我对 QLn220 所做的)。

所以我的问题是,我应该将 QL220(在代码中)设置为“hybrid_xml_zpl”吗?还是应该将其设置为“ZPL”或其他?

显然至少有这么多不同的选择:

由于我无法以编程方式读取 Zebra 皮带打印机的设备语言值(请参阅如何从 OpenNETCF.IO.Ports.SerialPort 读取字符串?,我需要在代码中将其设置为合理的值。

我担心的是 QLn220 需要“hybrid_xml_zpl”,但 QL220 需要其他(什么?)。

所以:我是否需要让用户区分打印机型号(从列表中选择他们的型号),然后通过将该命令发送到打印机以编程方式设置适当的设备语言,或者我可以通过发送相同的命令/使用QL220QLn220 使用相同的设备语言(可能是“hybrid_xml_zpl”)?

如果我对旧款 QL220 型号需要“hybrid_xml_zpl”以外的其他内容(也许这种设备语言比该型号晚?),我需要将什么设置为 QL220 的设备语言?

0 投票
1 回答
85 浏览

c# - 如何将 MessageBox 的内容拆分为 N 集?

我有这样的代码来向我展示我收到的异常中的 StackTrace:

...但是由于房地产的限制,我无法从这个小小的令人困惑的装置(手持设备)的内部看到整个公报;我无法将 MessageBox 拖得更高——它的头撞到了顶部,并且拒绝在屋顶上打一个洞,这样我就可以看到故事的其余部分。

那么如何让 MessageBox 将字符串拆分为可以循环播放的“情节”?

我的想法(伪代码)是这样的:

...但我认为“外面”有人有更好的主意或已经解决了这个问题...我认为对吗?

0 投票
1 回答
4096 浏览

media-queries - 媒体查询“手持”是否包括平板电脑?

这个问题很简单:媒体查询“手持”是否包括平板电脑? 注意我知道有些设备(例如 iPhone)不使用媒体手持设备。

0 投票
2 回答
303 浏览

windows-ce - 如何检测摩托罗拉 MC3100 扫描仪上的自由落体事件?

我搜索了谷歌并没有提出任何内容。有大量页面告诉我摩托罗拉 MC3100/MC3190 支持自由落体检测和事件记录,但我在文档或在线中找不到任何内容来说明如何通过编写自己的应用程序并挂钩事件来实现这一点或如果设备上某处的日志文件已经包含这些自由落体事件。

如何检测摩托罗拉 MC3100 扫描仪上的自由落体事件?