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() マクロを使用するか (例: "open" の代わりに TEXT("open"))、実行時に ANSI 文字列を UTF-16 に変換する必要があります (例: mbstowcs_s() 関数を使用)。

これが発生する理由は、プロジェクトが unicode 用に構成されているかどうかに応じて、TCHAR が char または wchar_t のいずれかである Microsoft char 型であるためです。lpFile とその仲間の型が LPCTCHAR (const TCHAR への long ポインター) であることに注意してください。つまり、(デフォルトの) 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 に答える