1

我有一个非常简单的窗口窗体程序,我想在按下按钮时启动 notepad.exe。我得到一些预期的错误。请帮忙。

在我的代码的开头,我有

#pragma once
#include <windows.h>
#include <Shellapi.h>

在事件处理程序中,我有

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {


                //memset(&ExecuteInfo, 0, sizeof(ExecuteInfo));

                ExecuteInfo.cbSize       = sizeof(ExecuteInfo);
                ExecuteInfo.fMask        = NULL;              
                ExecuteInfo.hwnd         = NULL;               
                ExecuteInfo.lpVerb       = "open";                      // Operation to perform
                ExecuteInfo.lpFile       = "C:\\Windows\\notepad.exe";  // Application name
                ExecuteInfo.lpParameters = NULL;           // Additional parameters
                ExecuteInfo.lpDirectory  = NULL;                          // Default directory
                ExecuteInfo.nShow        = SW_SHOW;
                ExecuteInfo.hInstApp     = NULL;

                ShellExecuteEx(&ExecuteInfo);

         }

注意:如果我在属性页>配置属性>常规(ALT-F7)下设置为“使用 Unicode 字符集”,我会收到以下错误消息

1>c:\users\marco\desktop\new folder (2)\test000\test000\Form1.h(140): error C2440: '=' : cannot convert from 'const char [5]' to 'LPCWSTR'
1>          Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>c:\users\marco\desktop\new folder (2)\test000\test000\Form1.h(141): error C2440: '=' : cannot convert from 'const char [23]' to 'LPCWSTR'
1>          Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

注意:如果我在属性页>配置属性>常规(ALT-F7)下设置为“使用多字节字符集”,我会收到以下错误消息

1>test000.obj : error LNK2028: unresolved token (0A000012) "extern "C" int __stdcall ShellExecuteExA(struct _SHELLEXECUTEINFOA *)" (?ShellExecuteExA@@$$J14YGHPAU_SHELLEXECUTEINFOA@@@Z) referenced in function "private: void __clrcall test000::Form1::button1_Click(class System::Object ^,class System::EventArgs ^)" (?button1_Click@Form1@test000@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)
1>test000.obj : error LNK2019: unresolved external symbol "extern "C" int __stdcall ShellExecuteExA(struct _SHELLEXECUTEINFOA *)" (?ShellExecuteExA@@$$J14YGHPAU_SHELLEXECUTEINFOA@@@Z) referenced in function "private: void __clrcall test000::Form1::button1_Click(class System::Object ^,class System::EventArgs ^)" (?button1_Click@Form1@test000@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)
1>C:\Users\Marco\Desktop\New folder (2)\test000\Debug\test000.exe : fatal error LNK1120: 2 unresolved externals
4

2 回答 2

1

您需要在字符串周围使用 TEXT() 宏(例如 TEXT("open") 而不是 "open")或在运行时将 ANSI 字符串转换为 UTF-16(例如,使用 mbstowcs_s() 函数)。

发生这种情况的原因是 TCHAR 是 Microsoft char 类型,它是 char 还是 wchar_t 取决于项目是否配置为 unicode。请注意,lpFile 和朋友的类型是 LPCTCHAR(指向 const TCHAR 的长指针),这意味着如果您使用(默认)unicode 配置,它最终会成为 const wchar_t*,而 char[] 不能隐式转换为它。

于 2012-04-25T01:48:33.130 回答
1

另一种解决方案:如果您使用的是 C++/CLI,您也可以使用托管方法来启动进程:

System::Diagnostics::Process::Start("C:\\Windows\\notepad.exe");

这也应该避免字符集问题。
这并不意味着您应该忽略它们,因为了解潜在问题是件好事。Roee Shenberg 在他的回答中提到了这一点。

于 2012-04-25T08:37:04.027 回答