簡體   English   中英

無法讀取CoTaskMemAlloc分配的結構的內存

[英]Can't read memory of a struct allocated by CoTaskMemAlloc

我有以下問題。

我正在實現一個IDataObject ,它負責將文件傳遞到剪貼板。 當我在IDataObject上調用GetData時,似乎返回了一個空的STGMEDIUM結構, STGMEDIUM結構具有不可讀的內存,盡管我可以確認該結構通過斷點填充了正確的值。 這是我的代碼:

調用GetData:

FORMATETC dsl_form={//some FORMATETC};
STGMEDIUM *dsl_med = {0};

HRESULT hr;
hr=dsp_in->GetData(&dsl_form, dsl_med);

GetData函數:

HRESULT STDMETHODCALLTYPE GetData(FORMATETC *dsp_fmt,STGMEDIUM *dsp_med) {
    int iml_idx=m_lookup_format(dsp_fmt);//Search the FORMATETC-Array for a Format that equals the given Format
    //If no suitable FormatEtc was found, report an error
    if(iml_idx<0){
        return DV_E_FORMATETC;
    }
    //Allocate and fill a new STGMEDIUM structure
    dsp_med=(STGMEDIUM*) CoTaskMemAlloc(sizeof STGMEDIUM);
    dsp_med->tymed=dsc_filedesc[iml_idx].tymed;
    dsp_med->pUnkForRelease=0;
    switch(dsc_filedesc[iml_idx].tymed) {
    case TYMED_HGLOBAL:     dsp_med->hGlobal=m_dup_global_mem(dsc_filecontents[iml_idx].hGlobal);
                            break;
    default:                return DV_E_FORMATETC;
    }

    return S_OK;

這個

STGMEDIUM *dsl_med = {0};

HRESULT hr;
hr=dsp_in->GetData(&dsl_form, dsl_med);

將空的dsl_med復制到函數參數中,被調用的函數將更改傳遞給它的副本,但是原始的空值未更改,因此調用方的指針保持為空。

一種選擇是更改功能簽名,使其接受STGMEDIUM**並相應地更改其余代碼。 但是,在這種情況下-實現IDataObject::GetData() -您不能更改簽名。 如果您閱讀了MSDN描述,它將說明該功能應僅將其分配的內容分配給該結構的成員,並且調用方必須分配該結構並有選擇地釋放其成員。

所以你必須傳遞結構體的地址

STGMEDIUM dsl_med = {0};
object->GetData(&dsl_from, &dsl_med);

在函數內部,您只需設置結構成員。

暫無
暫無

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

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