wstring - > ShellExecute中的LPCWSTR给出了错误LNK2028& LNK2019

时间:2011-04-16 00:51:38

标签: c++ visual-c++ unicode wstring lnk2019

您好我正在用UNICODE和/ clr编写Visual C ++ 2010(西班牙语)编程。我有一个名为“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&gt;)“ (?callSystem @@ $$ FYAXV?$ basic_string的@ DU?$ char_traits @ d @ @@ STD V'$分配器@ 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) 未解决的“无效” __cdecl callSystem(class std :: basic_string,classstd :: allocator)“ 功能 (?callSystem @@ $$ FYAXV?$ basic_string的@ DU?$ char_traits @ d @ @@ STD V'$分配器@ d @ @@ 2 STD @@@ Z)

是某种配置吗?

2 个答案:

答案 0 :(得分:1)

在解决方案资源管理器,属性,链接器,输入中右键单击您的项目。将shell32.lib添加到Additional Dependencies设置。

请注意,使用/ clr选项编译此代码没有什么意义,您没有编写任何托管代码。 ShellExecute()函数的等价物是Process :: Start()。

答案 1 :(得分:1)

旁注:您确实意识到在这种情况下您无需手动从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);
}