簡體   English   中英

如何從“LPCTSTR”類型的 function 返回一個值?

[英]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::wstringc_str()成員。

這需要 C++17 從data()返回指向非常量的指針。 另請注意,我省略了使用通用文本映射 這些都沒有用,除非你的目標是 Win9x(它已經停止支持一段時間了)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM