gpt4 book ai didi

c++ - Winapi ShellExecuteEx 不打开文件

转载 作者:行者123 更新时间:2023-11-27 22:42:50 26 4
gpt4 key购买 nike

我是 WinApi 的新手,我想打开我的 D: 驱动器中的文本文件,但这段代码不起作用。当我运行该应用程序时,出现错误:“Windows 找不到文件‘lobalizarion\Sorting\sortdefaults.nls’”。在控制台中我收到消息:“找不到文件”,但我已经打开了我的驱动器。

在我的代码中,我使用的代码片段来自:How to get hWnd of window opened by ShellExecuteEx.. hProcess?获取创建的 HINSTANCE 的 HWND。

#include "stdafx.h"
#include <Windows.h>
#include <iostream>
#include <vector>

std::wstring stringToLPCTSTR(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;
}

struct ProcessWindowsInfo
{
DWORD ProcessID;
std::vector<HWND> Windows;

ProcessWindowsInfo(DWORD const AProcessID) : ProcessID(AProcessID) {}
};

BOOL __stdcall EnumProcessWindowsProc(HWND hwnd, LPARAM lParam)
{
ProcessWindowsInfo *Info = reinterpret_cast<ProcessWindowsInfo*>(lParam);
DWORD WindowProcessID;

GetWindowThreadProcessId(hwnd, &WindowProcessID);

if (WindowProcessID == Info->ProcessID)
Info->Windows.push_back(hwnd);

return true;
}

int main()
{
SHELLEXECUTEINFOW sei;

sei.cbSize = sizeof(SHELLEXECUTEINFO);
sei.fMask = SEE_MASK_NOCLOSEPROCESS;
sei.hwnd = NULL;
sei.lpVerb = stringToLPCTSTR("open").c_str();
sei.lpFile = stringToLPCTSTR("D:\\file.txt").c_str();
sei.lpParameters = NULL;
sei.lpDirectory = stringToLPCTSTR("D:\\").c_str();;
sei.nShow = SW_SHOWNORMAL;
sei.hInstApp = NULL;

auto retval = ShellExecuteEx(&sei);

if (retval == 0) //check errors
{
if ((int)sei.hInstApp == SE_ERR_FNF)
std::cerr << "File was not found\n";
else
std::cerr << "Unexpected error occured\n";
}
else
{
WaitForInputIdle(sei.hProcess, INFINITE);

ProcessWindowsInfo info(GetProcessId(sei.hProcess));

EnumWindows((WNDENUMPROC)EnumProcessWindowsProc, reinterpret_cast<LPARAM>(&info));
}

std::cin.get();

return 0;
}

最佳答案

stringToLPCTSTR() 返回的 std::wstring 是临时变量,您可以使用它来分配结构 LPCTSTR 成员SHELLEXECUTEINFOW。这意味着在您调用 ShellExecuteEx() 时,分别调用 c_str() 返回的指针可能不再有效。您需要为此找到不同的解决方案,例如通过为 std::wstring 使用局部变量,但只要您只使用字符串文字,您就可以这样做

sei.lpVerb = L"open";
sei.lpFile = L"D:\\file.txt";
sei.lpDirectory = L"D:\\";

关于c++ - Winapi ShellExecuteEx 不打开文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46957879/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com