[英]How to return a value from a function of type `LPCTSTR`?
從 function 返回wintitle
的“正確”方法是什么?
我做編譯器的方式是指向這個警告: warning C4172: returning address of local variable or temporary: wintitle
LPCTSTR WinGetTitle(HWND hWnd)
{
TCHAR wintitle[250];
GetWindowText(hWnd, wintitle, GetWindowTextLength(hWnd) + 1);
return wintitle;
}
LPCTSTR wintitle;
wintitle = WinGetTitle(hWnd);
編譯器診斷正確: wintitle
是一個 object,具有自動存儲持續時間。 當 function 返回時,它的 memory 被自動釋放,使返回的指針懸空。
如果你確實希望(你可能不希望)返回一個指針,你必須讓它指向 memory ,它比 function 調用的壽命更長。 這要么是指向具有 static 存儲持續時間的緩沖區的指針,要么是堆分配。 兩者都不是特別有用(前者需要固定大小,后者將釋放 memory 的負擔放在調用者身上,調用者通常不知道如何去做)。
返回自動管理其 memory 的 object 更為實用。 使用std::wstring
是規范的解決方案。 您可以實例化一個 object,用內容填充它,然后將其返回給調用者:
std::wstring WinGetTitle(HWND hWnd)
{
std::wstring wintitle;
auto const len = ::GetWindowTextLengthW(hWnd);
if (len > 0) {
wintitle.resize(static_cast<size_t>(len));
GetWindowTextW(hWnd, wintitle.data(), len + 1);
}
return wintitle;
}
如果您需要獲取LPCWSTR
指針以將其傳遞給其他 API 調用,則可以使用std::wstring
的c_str()
成員。
這需要 C++17 從data()
返回指向非常量的指針。 另請注意,我省略了使用通用文本映射。 這些都沒有用,除非你的目標是 Win9x(它已經停止支持一段時間了)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.