- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我不懂 C++,我在尝试将字符串名称附加到 SHELLEXECUTEINFO 的 lpFile 时遇到问题。我从 Installshield 得到一个分号分隔的字符串,然后将它拆分并循环遍历它。然后,我试图附加从字符串中拆分出来的每个“功能”,并通过 shell 执行将其发送到 dism.exe。
它在 swprintf_s(buf, _T("Dism.exe/Online/Enable-Feature/FeatureName:%s"), sizeof(buf), wc);
处失败然后它至少会触发 dll 并抛出 dism.exe 错误,所以我知道调用工作正常。
template<typename Out>
void split(const std::string &s, char delim, Out result) {
std::stringstream ss;
ss.str(s);
std::string item;
while (std::getline(ss, item, delim)) {
*(result++) = item;
}
}
HRESULT __stdcall SplitString(IDispatch *pAction) {
// Create a pointer to the IsSuiteExtension COM interface
CComQIPtr<ISuiteExtension2> spSuiteExtension2 = pAction;
// Turn on notifications for both the progress bar(epfProgressValid) and the ui message(epfMessageValid).
EnumProgressFlags pf = EnumProgressFlags(EnumProgressFlags::epfMessageValid | EnumProgressFlags::epfProgressValid);
BSTR bstrFeatureList(_T("ENABLE_FEATURES")); // Property name to get. This should be a semi-colon delimeted list of features to enable for windows.
BSTR FeatureList = ::SysAllocStringLen(NULL, 2 * 38); // Where to store the property value
HRESULT hRet = spSuiteExtension2->get_Property(bstrFeatureList, &FeatureList); // Get the property value and store it in the 'FeatureList' variable
CW2A pszConverted(FeatureList);
using namespace std;
string strConverted(pszConverted);
vector<string> tokens;
split(strConverted, ';', back_inserter(tokens));
int numTokens = tokens.size();
for (int i = 0; i < numTokens; i++)
{
string t = tokens.at(i);
TCHAR buf[1024];
SHELLEXECUTEINFO ShExecInfo = { 0 };
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
// Convert ANSI to Unicode
ATL::CA2W wc(tokens.at(i).c_str());
swprintf_s(buf, _T("Dism.exe /Online /Enable-Feature /FeatureName:%s"), sizeof(buf), wc); // HAVING ISSUES HERE. NEED TO APPEND tokens.at(i) AT %S
ShExecInfo.lpFile = buf;
ShExecInfo.lpParameters = _T("");
ShExecInfo.lpDirectory = _T("C:\\Windows\\SysNative");
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
WaitForSingleObject(ShExecInfo.hProcess, INFINITE);
}
//MessageBoxA(NULL, strConverted.c_str(), "testx", MB_OK);
return ERROR_SUCCESS;
}
最佳答案
由于您的代码使用了 TCHAR
字符串,你应该使用 _stprintf_s()
而不是 swprintf_s()
.正如 Adrian McCarthy 所说,您以错误的顺序传递了它的参数,因此您的代码甚至不应该从一开始就编译。
但更重要的是,无需涉及ANSI或TCHAR
根本。你有 Unicode 输入,STL 和 ShellExecuteEx()
两者都支持 Unicode,因此只需将所有内容都保留为 Unicode。
您还泄露了 BSTR
你分配给 FeatureList
,以及过程HANDLE
那ShellExecuteEx()
返回。
尝试更像这样的东西:
template <typename Out>
void split(const std::wstring &s, wchar_t delim, Out result) {
std::wistringstream iss(s);
std::wstring item;
while (std::getline(iss, item, delim)) {
*(result++) = item;
}
}
HRESULT __stdcall SplitString(IDispatch *pAction) {
// Create a pointer to the IsSuiteExtension COM interface
CComQIPtr<ISuiteExtension2> spSuiteExtension2 = pAction;
// Turn on notifications for both the progress bar(epfProgressValid) and the ui message(epfMessageValid).
EnumProgressFlags pf = EnumProgressFlags(EnumProgressFlags::epfMessageValid | EnumProgressFlags::epfProgressValid);
CComBSTR FeatureList;
HRESULT hRet = spSuiteExtension2->get_Property(CComBSTR(L"ENABLE_FEATURES"), &FeatureList); // Get the property value and store it in the 'FeatureList' variable
std::vector<std::wstring> tokens;
split(static_cast<BSTR>(FeatureList), L';', std::back_inserter(tokens));
int numTokens = tokens.size();
for (int i = 0; i < numTokens; i++)
{
std::wstring params = L"/Online /Enable-Feature /FeatureName:" + tokens.at(i);
SHELLEXECUTEINFOW ShExecInfo = { 0 };
ShExecInfo.cbSize = sizeof(ShExecInfo);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.lpFile = L"Dism.exe";
ShExecInfo.lpParameters = params.c_str();
ShExecInfo.lpDirectory = L"C:\\Windows\\SysNative";
ShExecInfo.nShow = SW_SHOW;
if (ShellExecuteExW(&ShExecInfo))
{
WaitForSingleObject(ShExecInfo.hProcess, INFINITE);
CloseHandle(ShExecInfo.hProcess);
}
}
//MessageBoxW(NULL, FeatureList, L"testx", MB_OK);
return ERROR_SUCCESS;
}
也就是说,启动 EXE 时,您应该使用 CreateProcess()
直接代替 ShellExecuteEx()
:
for (int i = 0; i < numTokens; i++)
{
std::wstring cmd = L"Dism.exe /Online /Enable-Feature /FeatureName:" + tokens.at(i);
STARTUPINFO si = {0};
PROCESS_INFORMATION pi = {0};
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOW;
if (CreateProcessW(NULL, &cmd[0], NULL, NULL, FALSE, 0, NULL, L"C:\\Windows\\SysNative", &si, &pi))
{
CloseHandle(pi.hThread);
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
}
}
关于C++ 运行 SHELLEXECUTEINFO 并附加功能名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44316457/
我关注了 tutorial on creating a popup for an add-on在 Firefox 中,效果很好。 我现在遇到的问题是它创建的弹出窗口不会更改大小以适应我添加到其中的内容
我有一些视频,我需要连接一个标题并添加一些覆盖,问题是我需要先做覆盖,否则时间不正确,然后才将标题连接到视频的开头 ffmpeg -i talk.mp4 -i start_pancarte.png
我正在尝试附加一个 CSV 文件。这是我正在使用的线路。不幸的是,我找不到 export-csv 的附加选项。任何想法都有助于使其发挥作用。 Get-ADGroupMember "Domain Adm
我正在努力理解 Attach API (com.sun.tools.attach.*) 的用途。它的典型用途是什么?它是为了“模拟”JVM,以便您可以在不部署/启动代码的情况下测试您的代码吗?它是一个
我不明白为什么这不起作用。 soup_main = BeautifulSoup('FooBar') soup_append = BeautifulSoup('Meh') soup_main.body.
我有以下代码来返回我想要的字符串 $sql = " SELECT `description` FROM `auctions` WHERE `description` REGEX
我正在尝试从数组中附加具有多个值的元素,但我做错了。这是我的代码: for(var i=0; i ` + pricesArray[i].start_date ` ` + pricesArray[i
我正在尝试将图像链接添加到此 javascript 附加表中。使图像位于按钮上方 这是代码 $("#1").append(""+section+""+no+""+price+""+button+""
我有一个问题,我已经解决了,但它太烦人了。 我有一个 js 代码,当使用“追加”按下按钮时,它会放下一些 html 代码,并且通过该代码,我为 x 按钮提供了一个 id,并为容器元素提供了一个 id。
我想逐行读取文件,并且每一行可能都有很多字符。 这个版本的readline效果很好 func readLine(r *bufio.Reader) ([]byte, error) { var (
我有一个网站,每次用户登录或注销时,我都会将其保存到文本文件中。 如果不存在,我的代码在附加数据或创建文本文件时不起作用。这是示例代码 $myfile = fopen("logs.txt", "wr"
我正在尝试使用 typescript 和 Formik 创建一个自定义输入字段。我可以就完成以下代码的最佳方式获得一些帮助吗?我需要添加额外的 Prop 标签和名称......我已经坚持了一段时间,希
我有一个字符串 big_html,我想将它添加到某个 div 中。我观察到以下方面的性能差异: $('#some-div').append( big_html ); // takes about 10
如何使用 FormData 创建以下结果 ------WebKitFormBoundaryOmz20xyMCkE27rN7 Content-Disposition: form-data; name="
有没有办法附加 jQuery 事件处理程序,以便在任何先前附加的事件处理程序之前触发该处理程序?我遇到了this article ,但代码不起作用,因为事件处理程序不再存储在数组中,而这正是他的代码所
我正在开发一个需要网络登录的 iPhone 应用程序。像往常一样我打电话 [[UIApplication sharedApplication] openURL:loginURL]; 这将关闭应用程序并
我想开发一个仅针对特定域激活的扩展。 我不希望它在不浏览此特定域时出现在浏览器菜单中。 有可能这样做吗? 最佳答案 可能:对于菜单,您可以添加一个弹出窗口侦听器,用于检查当前加载的URL(docs f
这段 JavaScript 代码 function writeCookie(CookieName, CookieValue, CookieDuration) { var expiration
我正在使用 Handlebars 来渲染使用ajax从本地服务器获得的信息。我的 HTML 看起来像: {{#each Tabs}}
我尝试了以下代码,但当输入框中没有数据时它不会通知。当我直接添加此内容(不附加)时,它会起作用。我在这里做错了什么 var output = "\n"+ "\n"+
我是一名优秀的程序员,十分优秀!