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 (class std :: basic_string, class std :: allocator> ) "(? callSystem @@ $$ FYAXV? $ basic_string @ DU? $ char_traits @ D @ std @@ V? $ allocator @ D @ 2 @@ std @@

  • ошибка LNK2019: внешний символ "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 (class std :: basic_string, classstd :: allocator)" (? CallSystem @@ $$ FYAXV? $ Basic_string @ DU? $ Char_traits @ D @ std @@ V? $ Allocator @ D @ 2 @@ std @@@ Z)

Есть какая-то конфигурация?


person Galled    schedule 16.04.2011    source источник
comment
Вы включаете Shell32.lib в свою ссылку?   -  person Jollymorphic    schedule 16.04.2011
comment
Я новичок в C ++. Как связать Shell32.lib?   -  person Galled    schedule 16.04.2011


Ответы (2)


Щелкните правой кнопкой мыши свой проект в обозревателе решений, свойствах, компоновщике, вводе. Добавьте shell32.lib в параметр Additional Dependencies.

Помните, что нет смысла компилировать этот код с параметром / clr, вы не писали никакого управляемого кода. Эквивалент функции ShellExecute () - Process :: Start ().

person Hans Passant    schedule 16.04.2011

Кстати, вы понимаете, что вам не нужно вручную преобразовывать 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);
} 
person Remy Lebeau    schedule 19.04.2011
comment
ShellExecuteA() - это версия Ansi, ShellExecuteW() - версия Unicode. ShellExecuteA() вызывает ShellExecuteW() внутри, конвертируя строки Ansi в Unicode по мере необходимости. ShellExecute() - это псевдоним, который отображается на ShellExecuteA() или ShellExecuteW() в зависимости от того, скомпилирован ли проект с UNICODE определенным или нет. В вашем примере это так (иначе ShellExecute() не будет принимать данные wchar_t*). Большинство функций Win32 API, работающих со строковыми данными, используют такое же отображение A / W. - person Remy Lebeau; 21.04.2011