【新人求助】关于在VS2013上引用msxml6.dll失败

ToNewLife 2018-11-12 04:49:12
各位大佬,请教下如何在VS2013的C++下引用msxml6.dll这个文件呢?在VC6上第二条引用是成功的,但是到了VS2013上就报错
请问我该如何处理?系统为win10 64位

引用方式1:
#import "msxml6.dll" rename_namespace("xml")
失败: 78 IntelliSense: 无法打开 源 文件 "*/Debug/msxml6.tlh"
msxml6.dll存在DEBUG目录下
引用方式2:
#import "C:\\WINDOWS\\system32\\msxml6.dll" rename_namespace("xml")
失败: 无法打开 源 文件 "*/Debug/msxml6.tlh" 、
msxml6.dll存在system32目录下
引用方式3:
#import "C:\\Windows\\SysWOW64\\msxml6.dll" rename_namespace("xml")
失败: 无法打开 源 文件 "*/Debug/msxml6.tlh" 、
msxml6.dll存在SysWOW64目录下
...全文
542 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
ToNewLife 2018-11-14
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
Jacky's null-blog

随笔 - 3, 文章 - 0, 评论 - 2, 引用 - 0
64 位 Windows 平台注意点之文件系统重定向

Program Files 的重定向

很多开发人员都知道,在 64 位 Windows 系统上,32 位程序是无法获取得到 C:\Program Files 的完整路径的,只能获取到 C:\Program Files (x86)。不管你用的是什么方法:

TCHAR szPath[MAX_PATH] = { 0 };
ExpandEnvironmentStrings(_T("%ProgramFiles%"), szPath, MAX_PATH);
又或者是:

SHGetSpecialFolderPath(NULL, szPath, CSIDL_PROGRAM_FILES, FALSE);
SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL, SHGFP_TYPE_CURRENT, szPath);
这个问题在 Windows NT 6.0 (Windows Vista) 之前的系统上无解,只有 64 程序可以拿到这个路径。Windows NT 6.0 开始,微软对此进行了重新设计,将以前称作“Special Folders”的系统文件夹起了个新名字叫“Known Folders”,同时提供了一套新的接口,包括 Windows API 函数 SHGetKnownFolderPath,COM 接口 IKnownFolder 和 IKnownFolderManager 来管理这些系统文件夹,原来的 CSIDL (Constant Special Item ID list) 系列整数值也被一套新的“KNOWNFOLDERID”系列 GUID 所代替,可以获取得到的文件夹数量比以前也更多。如,程序可以直接获取 Quick Launch (FOLDERID_QuickLaunch) 以及 LocalLow (FOLDERID_LocalAppDataLow) 等路径。不过经测试,32 位程序使用下面的代码仍然无法获取到 C:\Program Files。

LPWSTR pszPath = NULL;
HRESULT hr = SHGetKnownFolderPath(FOLDERID_ProgramFilesX64, 0, NULL, &pszPath);
if (hr == S_OK)
{
CoTaskMemFree((void *)pszPath);
}
在 64 位系统上,上面的代码编译为 32 位程序,结果依然是失败。多年来,经过多次不懈的搜索,终于找到 32 位程序在 64 位系统上获取 C:\Program Files 的方法:

TCHAR szPath[MAX_PATH] = { 0 };
ExpandEnvironmentStrings(_T("%ProgramW6432%"), szPath, MAX_PATH);
虽然说这个环境变量并无法在批处理和命令行中使用。个人猜测,这个环境变量仅在 64 位系统上的 32 位程序中有效。而 64 位系统的 cmd 也是 64 位,自然批处理中无法使用环境变量。经测试,Windows XP x64 Edition 也能通过这个方法得到该路径。

System32 的重定向

System32 重定向和 Program Files 不同的是,System32 的重定向是底层实现的,即 32 位程序显式的指定向 System32 文件夹写入,实际还是写入到 SysWOW64。而 32 位程序在拥有权限的情况下,向 Program Files 写入并不会被重定向到 Program Files (x86)。向 System32 和 Program Files 两个文件夹中写入数据的相同点是都需要管理员权限,否则无法写入。System32 的重定向是可以通过以下的 API 来更改:

PVOID lpOldValue = NULL;
if (Wow64DisableWow64FsRedirection(&lpOldValue))
{
// 调用 CreateFile、_open、fopen 等
Wow64EnableWow64FsRedirection(lpOldValue);
}
或者使用 Wow64RevertWow64FsRedirection 在两种状态之间切换。

posted on 2015-11-20 18:00 Jacky_CN 阅读(...) 评论(...) 编辑 收藏

刷新评论刷新页面返回顶部
导航

博客园
首页
新随笔
联系
订阅 订阅
管理
公告

Powered by:
博客园
Copyright ? Jacky_CN

谢谢赵哥。我最后用了tinyxml2来解决这个问题。实在没调通这个引用,干脆就不用了
赵4老师 2018-11-12
  • 打赏
  • 举报
回复
Jacky's null-blog

随笔 - 3, 文章 - 0, 评论 - 2, 引用 - 0
64 位 Windows 平台注意点之文件系统重定向

Program Files 的重定向

很多开发人员都知道,在 64 位 Windows 系统上,32 位程序是无法获取得到 C:\Program Files 的完整路径的,只能获取到 C:\Program Files (x86)。不管你用的是什么方法:

TCHAR szPath[MAX_PATH] = { 0 };
ExpandEnvironmentStrings(_T("%ProgramFiles%"), szPath, MAX_PATH);
又或者是:

SHGetSpecialFolderPath(NULL, szPath, CSIDL_PROGRAM_FILES, FALSE);
SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL, SHGFP_TYPE_CURRENT, szPath);
这个问题在 Windows NT 6.0 (Windows Vista) 之前的系统上无解,只有 64 程序可以拿到这个路径。Windows NT 6.0 开始,微软对此进行了重新设计,将以前称作“Special Folders”的系统文件夹起了个新名字叫“Known Folders”,同时提供了一套新的接口,包括 Windows API 函数 SHGetKnownFolderPath,COM 接口 IKnownFolder 和 IKnownFolderManager 来管理这些系统文件夹,原来的 CSIDL (Constant Special Item ID list) 系列整数值也被一套新的“KNOWNFOLDERID”系列 GUID 所代替,可以获取得到的文件夹数量比以前也更多。如,程序可以直接获取 Quick Launch (FOLDERID_QuickLaunch) 以及 LocalLow (FOLDERID_LocalAppDataLow) 等路径。不过经测试,32 位程序使用下面的代码仍然无法获取到 C:\Program Files。

LPWSTR pszPath = NULL;
HRESULT hr = SHGetKnownFolderPath(FOLDERID_ProgramFilesX64, 0, NULL, &pszPath);
if (hr == S_OK)
{
CoTaskMemFree((void *)pszPath);
}
在 64 位系统上,上面的代码编译为 32 位程序,结果依然是失败。多年来,经过多次不懈的搜索,终于找到 32 位程序在 64 位系统上获取 C:\Program Files 的方法:

TCHAR szPath[MAX_PATH] = { 0 };
ExpandEnvironmentStrings(_T("%ProgramW6432%"), szPath, MAX_PATH);
虽然说这个环境变量并无法在批处理和命令行中使用。个人猜测,这个环境变量仅在 64 位系统上的 32 位程序中有效。而 64 位系统的 cmd 也是 64 位,自然批处理中无法使用环境变量。经测试,Windows XP x64 Edition 也能通过这个方法得到该路径。

System32 的重定向

System32 重定向和 Program Files 不同的是,System32 的重定向是底层实现的,即 32 位程序显式的指定向 System32 文件夹写入,实际还是写入到 SysWOW64。而 32 位程序在拥有权限的情况下,向 Program Files 写入并不会被重定向到 Program Files (x86)。向 System32 和 Program Files 两个文件夹中写入数据的相同点是都需要管理员权限,否则无法写入。System32 的重定向是可以通过以下的 API 来更改:

PVOID lpOldValue = NULL;
if (Wow64DisableWow64FsRedirection(&lpOldValue))
{
// 调用 CreateFile、_open、fopen 等
Wow64EnableWow64FsRedirection(lpOldValue);
}
或者使用 Wow64RevertWow64FsRedirection 在两种状态之间切换。

posted on 2015-11-20 18:00 Jacky_CN 阅读(...) 评论(...) 编辑 收藏

刷新评论刷新页面返回顶部
导航

博客园
首页
新随笔
联系
订阅 订阅
管理
公告

Powered by:
博客园
Copyright ? Jacky_CN

ToNewLife 2018-11-12
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
64 位 Windows 平台注意点之文件系统重定向 http://www.cnblogs.com/jiake/p/4981555.html

赵老师,我看了下 DLL文件的确存在,也尝试安装MSXML.MSI ,结果也提示已经安装过。另外第一个链接无法打开~~
赵4老师 2018-11-12
  • 打赏
  • 举报
回复
64 位 Windows 平台注意点之文件系统重定向 http://www.cnblogs.com/jiake/p/4981555.html

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧