c++ - 在带有WM_COPYDATA消息的结构中使用LPCTSTR是否安全?

标签 c++ winapi mfc wm-copydata

我有这个结构:

typedef struct tagCOPY_PACKET
{
    TCHAR szFile[_MAX_PATH];
    GUID guidSignature;

} S_COPY_PACKET;

我准备使用WM_COPYDATA发送数据,如下所示:
CString strFile = GetFileToOpenFromFileExplorerPath();

S_COPY_PACKET sCopyDataPacket;
_tcscpy_s(sCopyDataPacket.szFile, _MAX_PATH, strFile);
sCopyDataPacket.guidSignature = CopyData_Signature;
COPYDATASTRUCT cds;
cds.dwData = COPYDATA_TYPE_MSA;
cds.cbData = sizeof(sCopyDataPacket);
cds.lpData = &sCopyDataPacket;

DWORD_PTR dwResult;
if (SendMessageTimeout(hOtherInstance, WM_COPYDATA,
                NULL, (LPARAM)(LPVOID)&cds, SMTO_BLOCK, 2000, &dwResult) != 0)
{
}

在另一端:
BOOL CMeetingScheduleAssistantDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
    if (pCopyDataStruct->dwData == COPYDATA_TYPE_MSA)
    {
        S_COPY_PACKET* pCopyPacket = (S_COPY_PACKET*)(pCopyDataStruct->lpData);
        if (pCopyPacket->guidSignature != CopyData_Signature)
        {
            // Bad GUID
            return FALSE;
        }

        if (GetLastActivePopup() != this) // Popup windows!
        {
            // TODO: Tell user?
            return FALSE;
        }

        theApp.SetFileToOpenFromFileExplorer(pCopyPacket->szFile);

        OpenFileFromFileExplorer();

        return TRUE;
    }

    return FALSE;
}

它工作正常。我只是想知道更改这样的结构是否可以接受:
typedef struct tagCOPY_PACKET
{
    LPCTSTR lpszFile;
    GUID guidSignature;

} S_COPY_PACKET;

然后使用:
S_COPY_PACKET sCopyDataPacket;
sCopyDataPacket.lpszFile = strFile.GetBufferSetLength(_MAX_PATH);
sCopyDataPacket.guidSignature = CopyData_Signature;
COPYDATASTRUCT cds;
cds.dwData = COPYDATA_TYPE_MSA;
cds.cbData = sizeof(sCopyDataPacket);
cds.lpData = &sCopyDataPacket;
...

并且,一旦消息已发布并处理:
strFile.ReleaseBuffer();

LPCTSTR方法与WM_COPYDATA一起使用是否安全?如果可以,为什么?

最佳答案

documentation of WM_COPYDATA 说:

The data being passed must not contain pointers or other references to objects not accessible to the application receiving the data.



因此,当CMeetingScheduleAssistantDlg位于其他可执行文件中时,您不能传递LPCTSTR值。如果它在同一可执行文件中,则可能会起作用。

关于c++ - 在带有WM_COPYDATA消息的结构中使用LPCTSTR是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61725198/

相关文章:

c++ - 在While循环中添加break语句时,为什么会出现错误?

c++ - 如何覆盖 QPlainTextEdit 中的撤消/重做

c++ - 在MFC中捕获鼠标指针形状变化事件

c++ - C++生命周期延长的问题

windows - 使用 Windows IStream 下载文件

c++ - VS2010 C代码——字符串池

windows - 如何在窗口上设置 HICON(具有多种尺寸的 .ICO)?

c++ - 我的 RichEdit 控件可以包含可点击的链接吗?

c++ - CDaoRecordSet 从列中选择所有