【问题标题】:BSTR to LPCWSTR conversion when call CreateProcessW (Mobile MFC)调用 CreateProcessW (Mobile MFC) 时 BSTR 到 LPCWSTR 的转换
【发布时间】:2013-07-29 07:19:14
【问题描述】:

我有一个在 Windows mobile 6 上运行的小型 activex 控件。当我对应用程序名称 L"\blah\blah.exe" 进行硬编码时,我可以使用 api CreateProcessW

当我调用另一个返回 BSTR 的 API 时,该 API 包含我要传递给 CreateProcessW 的应用程序,它不起作用。我已经检查并填充了应用程序字符串,但我猜我在 BSTR 和 LPCWSTR (Wide cha error?) 之间遇到了转换问题。我试过用 OLE2CW 和 OLE2W 转换它。

我不是 VC 专家,我只需要让它发挥作用,所以我的问题是。

  1. 当我通过 API 收到 BSTR 时,如何将其转换为能够将其传递给 CreateProcessW 中的 Application 参数?这是 Windows Mobile 6 (Wince 5.2)。一个 Code sn-p 会很棒。

没有任何转换的代码示例:

 BSTR app = NULL;

_host->GetAppString(_T("app"),&app);

     CreateProcessW(app,L"22222",0,0,0,0,0,0,0,&processInformation);

字符集是 Unicode。

谢谢

【问题讨论】:

  • 无需转换 BSTR,它与 LPCWSTR 兼容。在您添加正确的错误处理以便您知道为什么它失败之前,这不会变得更好。
  • 嗨,汉斯,我确实添加了错误处理,但没有将它添加到顶部。我得到的唯一错误是系统找不到指定的文件。我相信 BSTR 字符串与不是 32 位的 Windows CE 系统上的 LPCWSTR 不完全兼容。
  • “找不到文件”是一个非常常见的错误,我们不太可能帮助您找到文件。确保它是完整路径,例如 c:\foo\bar\baz.exe。您当然应该在您的问题中记录这一点。不,CE 是 32 位的。
  • 您对 CE 的看法是正确的。没有文件路径 C:\。 CE 文件路径是 \\.我知道路径是正确的。我指定了它的硬编码。如果我的问题激怒了你并且我没有给你足够的信息,请忽略我的问题。我很抱歉。

标签: c++ visual-studio visual-c++ mfc visual-c++-2010


【解决方案1】:

根据this MSDN article(也叫this SO article),可以通过_bstr_t类提取wchar_t指针,比如

_bstr_t bsApp(app, true);
wchar_t *pApp = (wchar_t *)bsApp;
CreateProcessW(pApp, L"22222", 0, 0, 0, 0, 0, 0, 0, &processInformation);

编辑:使用 CString

CStringW ss = app:
CreateProcessW(ss, L"22222", 0, 0, 0, 0, 0, 0, 0, &processInformation);

【讨论】:

  • 嗨,Edward,看起来从 API 返回的 BSTR 被编码为 ANSI。当我将它写入文件时,它包含正确的路径,但缺少第二个字符示例“\\dummy\dummy.exe”,但是当我编写用 L 创建的 BSTR 时,我得到了额外的空格 exampleo \ d d \ d d \ d d \ d。我做了一些研究,似乎它也可以编码为ANSI。不知道如何将它转换回WIDE。
  • 我没有意识到适用于 Windows CE 的 MFC 包含 CString -- 上面已编辑答案以使用 CStringW
猜你喜欢
  • 2013-05-12
  • 2011-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-04
  • 2013-05-24
  • 2011-04-08
  • 2010-09-15
相关资源
最近更新 更多