【发布时间】:2018-10-04 09:52:59
【问题描述】:
今天,在编写一些 VB.NET 代码时,我必须访问两个外部 DLL 才能使用某些方法。我发现的帮助主题告诉我使用以下外部方法:
- shlwapi.dll → PathIsNetworkPath (Reference 1)
- mpr.dll → WNetAddConnection2 和 WNetCancelConnection2 (Reference 2)
但是,当我尝试从我的代码中调用这些方法时,我收到一条错误消息,指出入口点不存在。所以我做了一些研究,发现我的操作系统(Windows 7 企业版 32 位)中的 DLL 不完全包含这些方法,但是,我得到了:
- PathIsNetworkPath → PathIsNetworkPathA / PathIsNetworkPathW
- WNetAddConnection2 → WNetAddConnection2A / WNetAddConnection2W
- WNetCancelConnection2 → WNetCancelConnection2A / WNetCancelConnection2W
所以,我测试了他们的行为: * 以“A”结尾的方法按预期工作。 * 以“W”结尾的方法不能按预期工作,它们会引发错误或返回错误结果(例如,当它应该为“真”时为“假”)。 然而,帮助主题中没有人提到有类似的问题。
所以我做了一些研究,在 MSDN documentation 我发现 DLL 只包含以“A”和“W”结尾的方法,并且在我使用的三种情况下,它们都包含,据我所知,文档页面是相同的。事实上,在整个页面中,他们不使用以 A/W 结尾但没有它的方法的名称。
所以我的问题是:*为什么我的 DLL 中有方法“A”和“W”而不是没有 A/W 的方法?他们俩有什么区别?为什么方法“A”对我有效,而方法“W”无效?
【问题讨论】:
-
pinvoke marshaller 已经知道这个细节。您在 [DllImport] 声明中使用的 CharSet 属性很重要,CharSet.Ansi(默认)选择 A 版本,其他选择 W。我们真正知道的是您的声明不正确,我们看不到。
-
我之所以选择重新打开,是因为问题更多是关于 Visual Basic 方面的问题,而不仅仅是 WinAPI 函数的 A 和 W 变体之间的区别,@Damien。