我有以下问题。
我正在实现一个IDataObject
,它负责将文件传递给剪贴板。当我在GetData
上调用IDataObject
时,它似乎返回一个内存不可读的空STGMEDIUM
结构,尽管我可以通过断点确认结构中填充了正确的值。这是我的代码:
调用GetData:
FORMATETC dsl_form={//some FORMATETC};
STGMEDIUM *dsl_med = {0};
HRESULT hr;
hr=dsp_in->GetData(&dsl_form, dsl_med);
GetData-Function:
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;
答案 0 :(得分:0)
此
STGMEDIUM *dsl_med = {0};
HRESULT hr;
hr=dsp_in->GetData(&dsl_form, dsl_med);
将null dsl_med
复制到函数参数中,调用的函数会更改传递给它的副本,但原始的null值保持不变,因此调用者端的指针保持为空。
一种选择是更改函数签名,使其接受STGMEDIUM**
并相应地更改其余代码。但是在这种情况下 - 实施IDataObject::GetData()
时 - 您无法更改签名。如果你阅读MSDN描述,它解释了该函数应该只分配它分配给结构成员的东西,并且调用者必须分配结构并可选择释放其成员。
所以你必须传递结构的地址
STGMEDIUM dsl_med = {0};
object->GetData(&dsl_from, &dsl_med);
并在函数内部设置结构成员。