Wstring → LPCWSTR в ShellExecute дайте мне ошибку LNK2028 & LNK2019

57
6

Здравствуйте, я программирую на Visual С++ 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 (класс
    станд:: 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 @@$$ J224YGPAUHINSTANCE _ @@PAUHWND _ @@PB_W111H @Z)
    неразрешенные, упомянутые в "void
    __cdecl callSystem (класс std:: basic_string, classstd:: allocator) "
    функция
    (? CallSystem @@$$ FYAXV? $Basic_string @DU? $Char_traits @D @станд @@V? $Распределитель @D @2 @@станд @@@Z)


Является ли какой-то тип конфигурации?

спросил(а) 2011-04-16T03:51:00+04:00 9 лет, 5 месяцев назад
1
Решение
57

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

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

ответил(а) 2011-04-16T04:01:00+04:00 9 лет, 5 месяцев назад
57

На стороне примечания: вы понимаете, что вам не нужно вручную конвертировать из 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);
}

ответил(а) 2011-04-19T23:21:00+04:00 9 лет, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема