OleGetClipboard获取FileGroupDescriptorW乱码

jamseyang 2017-12-20 03:19:05
//////////下面打印cFileName是乱码
MessageBoxW(GetActiveWindow(), filegroup->fgd[i].cFileName, L"test", 0);
代码如下:

// OleGetClipboardTest.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"


// 【MoreWindows工作笔记10】OleGetClipboard 访问剪切板上的文件信息
// http://blog.csdn.net/morewindows/article/details/17655057
// By MoreWindows( http://blog.csdn.net/MoreWindows )
#include <Windows.h>
#include <ObjBase.h>
#include <shlobj.h>
#include <iostream>
#include <iostream>
using namespace std;

void DisplayDataObject(IDataObject *pDataObject)
{

IEnumFORMATETC* pEnumFmt;
STGMEDIUM stgmedium;
FORMATETC fmt = {0};
char szBuf[1024] = {0};
HRESULT hr = pDataObject->EnumFormatEtc(DATADIR_GET,&pEnumFmt);
while(S_OK == pEnumFmt->Next(1, &fmt, NULL)) {
GetClipboardFormatName(fmt.cfFormat, szBuf, sizeof(szBuf));

if (strcmpi(szBuf, "FileGroupDescriptorW")==0)
{
if (pDataObject->GetData(&fmt, &stgmedium) == S_OK)
{
FILEGROUPDESCRIPTORW *filegroup = (FILEGROUPDESCRIPTORW*)stgmedium.hGlobal;
for (UINT i = 0; i < filegroup->cItems; i++)
{
//////////下面打印cFileName是乱码
MessageBoxW(GetActiveWindow(), filegroup->fgd[i].cFileName, L"test", 0);
}

}
}


if(fmt.tymed & TYMED_HGLOBAL){
cout<<"TYMED_HGLOBAL supported"<<endl;
}

}

pEnumFmt->Release();
}

int main()
{
if (OleInitialize(0) != S_OK) return 0;
IDataObject *pDataObject;
if (OleGetClipboard(&pDataObject) == S_OK)
{
DisplayDataObject(pDataObject);
pDataObject->Release();
}
OleUninitialize();
return 0;
}
...全文
749 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
jamseyang 2017-12-20
  • 打赏
  • 举报
回复
改为这样就可以了
FILEGROUPDESCRIPTORW *filegroup = (FILEGROUPDESCRIPTORW*)GlobalLock(stgmedium.hGlobal);
zgl7903 2017-12-20
  • 打赏
  • 举报
回复
hGlobal 一般 用 GlobalLock 后再访问 FILEGROUPDESCRIPTORW *filegroup = (FILEGROUPDESCRIPTORW*) GlobalLock(stgmedium.hGlobal); for (UINT i = 0; i < filegroup->cItems; i++) { //////////下面打印cFileName是乱码 MessageBoxW(GetActiveWindow(), filegroup->fgd[i].cFileName, L"test", 0); } GlobalUnlock(stgmedium.hGlobal);
jamseyang 2017-12-20
  • 打赏
  • 举报
回复
在资源管理器中拷贝文件后,再执行程序

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧