IDiaImageData
公开模块或映像的基位置和内存偏移量的详细信息。
语法
IDiaImageData : IUnknown
Vtable 顺序中的方法
下表显示了 IDiaImageData
方法。
方法 | 说明 |
---|---|
IDiaImageData::get_relativeVirtualAddress | 检索模块虚拟内存中相对于应用程序的位置。 |
IDiaImageData::get_virtualAddress | 检索映像的虚拟内存中的位置。 |
IDiaImageData::get_imageBase | 检索映像应基于的内存位置。 |
备注
某些调试流(XDATA、PDATA)包含同样存储在映像中的数据的副本。 可以针对 IDiaImageData
接口查询这些流数据对象。 有关详细信息,请参阅本主题中的“对调用者的说明”部分。
对调用者的说明
通过在 IDiaEnumDebugStreamData 对象上调用 QueryInterface
来获取此接口。 请注意,并非所有调试流都支持 IDiaImageData
接口。 例如,目前只有 XDATA 和 PDATA 流支持 IDiaImageData
接口。
示例
本示例在所有调试流中搜索支持 IDiaImageData
接口的任何流。 如果找到此类流,则会显示有关该流的一些信息。
void ShowImageData(IDiaSession *pSession)
{
if (pSession != NULL)
{
CComPtr<IDiaEnumDebugStreams> pStreamsList;
HRESULT hr;
hr = pSession->getEnumDebugStreams(&pStreamsList);
if (SUCCEEDED(hr))
{
LONG numStreams = 0;
hr = pStreamsList->get_Count(&numStreams);
if (SUCCEEDED(hr))
{
ULONG fetched = 0;
for (LONG i = 0; i < numStreams; i++)
{
CComPtr<IDiaEnumDebugStreamData> pStream;
hr = pStreamsList->Next(1,&pStream,&fetched);
if (fetched == 1)
{
CComPtr<IDiaImageData> pImageData;
hr = pStream->QueryInterface(__uuidof(IDiaImageData),
(void **)&pImageData);
if (SUCCEEDED(hr))
{
CComBSTR name;
hr = pStream->get_name(&name);
if (SUCCEEDED(hr))
{
wprintf(L"Stream %s:\n",(BSTR)name);
}
else
{
wprintf(L"Failed to get name of stream\n");
}
ULONGLONG imageBase = 0;
if (pImageData->get_imageBase(&imageBase) == S_OK)
{
wprintf(L" image base = 0x%0I64x\n",imageBase);
}
DWORD relVA = 0;
if (pImageData->get_relativeVirtualAddress(&relVA) == S_OK)
{
wprintf(L" relative virtual address = 0x%08lx\n",relVA);
}
ULONGLONG va = 0;
if (pImageData->get_virtualAddress(&va) == S_OK)
{
wprintf(L" virtual address = 0x%0I64x\n", va);
}
}
}
}
}
}
}
}
要求
标头:Dia2.h
库:diaguids.lib
DLL:msdia80.dll