我们一直使用的Shapes示例有点人为设计。现在我们来看一个可以在真正的Windows程序中使用的COM对象:打开对话框。
显示“打开”对话框的屏幕截图
要显示“ 打开”对话框,程序可以使用一个名为Common Item Dialog对象的COM对象。Common Item对话框实现了一个名为IFileOpenDialog的接口,该接口在头文件Shobjidl.h中声明。
这是一个向用户显示“ 打开”对话框的程序。如果用户选择一个文件,程序将显示一个包含文件名的对话框。
#include<windows.h>
#include<shobjidl.h>
int WINAPI wWinMain(HINSTANCE hInstance,HINSTANCE,PWSTR pCmdLine,int nCmdShow){
HRESULT hr=CoInitializeEx(NULL,COINIT_APARTMENTTHREADED|COINIT_DISABLE_OLE1DDE);
if(SUCCEEDED(hr)){
IFileOpenDialog *pFileOpen;
// Create the FileOpenDialog object.
hr=CoCreateInstance(CLSID_FileOpenDialog,NULL,CLSCTX_ALL,IID_IFileOpenDialog,reinterpret_cast<void**>(&pFileOpen));
if(SUCCEEDED(hr)){
// Show the Open dialog box.
hr=pFileOpen->Show(NULL);
// Get the file name from the dialog box.
if(SUCCEEDED(hr)){
IShellItem *pItem;
hr=pFileOpen->GetResult(&pItem);
if(SUCCEEDED(hr)){
PWSTR pszFilePath;
hr=pItem->GetDisplayName(SIGDN_FILESYSPATH,&pszFilePath);
// Display the file name to the user.
if(SUCCEEDED(hr)){
MessageBox(NULL,pszFilePath,L"File Path",MB_OK);
CoTaskMemFree(pszFilePath);
}
pItem->Release();
}
}
pFileOpen->Release();
}
CoUninitialize();
}
return 0;
}
这段代码使用了将在后面的模块中介绍的概念,所以如果你不了解这里的所有内容,请不要担心。这是代码的基本概述:
- 调用CoInitializeEx来初始化COM库。
- 调用CoCreateInstance创建Common Item Dialog对象,并获取指向对象的IFileOpenDialog接口的指针。
- 调用对象的Show方法,该方法向用户显示对话框。此方法阻塞,直到用户关闭对话框。
- 调用对象的GetResult方法。此方法返回一个指向第二个COM对象的指针,称为Shell项目对象。实现IShellItem接口的Shell项表示用户选择的文件。
- 调用Shell项目的GetDisplayName方法。此方法以字符串的形式获取文件路径。
- 显示一个显示文件路径的消息框。
- 调用CoUninitialize以取消初始化COM库。
步骤1,2和7调用由COM库定义的函数。这些是通用的COM功能。步骤3-5调用通用项目对话框对象定义的方法。
此示例显示了两种不同的对象创建方式:通用CoCreateInstance函数和特定于Common Item Dialog对象的方法(GetResult)。
下一个
管理对象的生命周期
相关话题
打开对话框示例