wstring -> LPCWSTR в ShellExecute выдает ошибку LNK2028 & LNK2019
Здравствуйте, я программирую на Visual C++ 2010 (испанский) с UNICODE и /clr. У меня есть файл заголовка с именем "fileFuncs.h":
#include <iostream>
#include <fstream>
#include <string>
#include <stdlib.h>
#include <string>
using namespace std;
std::wstring s2ws(const std::string& s)
{
int len;
int slength = (int)s.length() + 1;
len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, 0, 0);
wchar_t* buf = new wchar_t[len];
MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, buf, len);
std::wstring r(buf);
delete[] buf;
return r;
}
void callSystem(string sCmd){
std::wstring stemp = s2ws(sCmd);
LPCWSTR params = stemp.c_str();
ShellExecute(NULL,L"open",L"c:\\windows\\system32\\cmd.exe /S /C ",params,NULL,SW_HIDE);
}
Но когда я компилирую, выдают мне следующие ошибки:
ошибка LNK2028: ссылается на неразрешенный символ (токен) (0A0004A5) "extern" C "struct HINSTANCE__ *stdcall ShellExecuteW (struct HWND *, wchar_t const *, wchar_t const *, wchar_t const *, wchar_t const *, int)" (? ShellExecuteW @@ $$ J224YGPAUHINSTANCE_@@ PAUHWND_@@PB_W111H@Z) в функции "void __cdecl callSystem(класс std::basic_string, класс std::allocator >)" (? CallSystem@@$$FYAXV?$ Basic_string@) DU?$char_traits@D@ станд @@V?$ распределитель @D@2@@ станд @@
ошибка LNK2019: внешний символ "extern" C "struct HINSTANCE__ *stdcall ShellExecuteW (struct HWND *, wchar_t const *, wchar_t const *, wchar_t const *, wchar_t const *, int)" (? ShellExecuteW @@ $$J224YGPAUHHH_@@PB_W111H@Z) неразрешенная функция, указанная в функции "void __cdecl callSystem(class std::basic_string,classstd::allocator)" "(? CallSystem@@$$FYAXV?$ Basic_string@DU?$ Char_traits@D@std@@V?$ распределитель @D@2@@ станд @@@Z)
Это какой-то тип конфигурации?
2 ответа
Щелкните правой кнопкой мыши свой проект в обозревателе решений, свойства, компоновщик, ввод. Добавьте shell32.lib в параметр "Дополнительные зависимости".
Помните, что нет никакого смысла компилировать этот код с параметром /clr, вы не писали никакого управляемого кода. Эквивалентом функции ShellExecute() является Process::Start().
На заметку: вы понимаете, что вам не нужно конвертировать из std::string
в std::wstring
вручную в этой ситуации, верно? Как и большинство API-функций со строковыми параметрами, ShellExecute() предлагает варианты как Ansi, так и Unicode. Позвольте ОС сделать преобразование для вас:
#include <string>
void callSystem(std::string sCmd)
{
ShellExecuteA(NULL, "open", "c:\\windows\\system32\\cmd.exe /S /C ", sCmd.c_str(), NULL, SW_HIDE);
}