我在用Scrrun.dll枚举文件的时候
这样用
for(int i = 0; i<(int)FolderPtr->Files->Count; i++)
{
VARIANT var;
var.vt = VT_I4;
var.lVal = i;
FileColPtr = FolderPtr->Files;
hr = FileColPtr->get_Item(var,&FilePtr);
}
总不能取到FilePtr,这样做不对吗
用了VT_I2也不行,直接i,编译错误
另外IFileCollection::_NewEnum
怎么用,我想应该是有个回调函数的
这样用
for(int i = 0; i<(int)FolderPtr->Files->Count; i++)
{
VARIANT var;
var.vt = VT_I4;
var.lVal = i;
FileColPtr = FolderPtr->Files;
hr = FileColPtr->get_Item(var,&FilePtr);
}
总不能取到FilePtr,这样做不对吗
用了VT_I2也不行,直接i,编译错误
另外IFileCollection::_NewEnum
怎么用,我想应该是有个回调函数的
看来这个想法得改。
先得到IEnumVARIANT,
然后
HRESULT Next(
unsigned long celt,
VARIANT FAR* rgVar,
unsigned long FAR* pCeltFetched
);
#include <atlcomcli.h>
#undef GetFreeSpace
#import "g:\windows\system32\scrrun.dll" raw_interfaces_only#include <iostream>
int main()
{
std::cout<<"vc2003, windows2003, onega"<<std::endl;
CoInitialize(NULL);
{
try
{
Scripting::IFileSystem3Ptr fs;
fs.CreateInstance(__uuidof(Scripting::FileSystemObject));
Scripting::IFolderPtr folder;
fs->GetFolder(_bstr_t("c:\\downloads"),&folder);
_variant_t vsize;folder->get_Size(&vsize);
std::cout<<"c:\\downloads size:"<<(long)vsize<<" bytes"<<std::endl;
Scripting::IFileCollectionPtr files;
folder->get_Files(&files);
long count = 0;
files->get_Count(&count);
std::cout<<"files count:"<<count<<std::endl;
IUnknown *pUnk=NULL;
HRESULT hr = files->get__NewEnum(&pUnk);
if(SUCCEEDED(hr))
{
CComPtr<IEnumVARIANT> pEnum;
hr = pUnk->QueryInterface(IID_IEnumVARIANT,(void**)&pEnum);
if(pEnum)
{
pEnum->Reset();
ULONG fget = 1;
while(SUCCEEDED(hr)&&fget>0)
{
Scripting::IFilePtr file;
_variant_t varfile;
hr = pEnum->Next(1,&varfile,&fget);
if(SUCCEEDED(hr) && fget>0)
{
file = varfile.pdispVal;
BSTR bspath;
file->get_Path(&bspath);
std::cout<<"file path:"<<(LPCTSTR)_bstr_t(bspath)<<std::endl;
}
else
{
std::cout<<" get file return "<<hr<<std::endl;
}
} }
}
}
catch(_com_error &e)
{
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
std::cout<<"Get directory size via FileSystemObject, by masterz"<<std::endl;
std::cout<<"COM error occurred,source:"<<(LPCTSTR)bstrSource<<std::endl;
std::cout<<"Description:"<<(LPCTSTR)bstrDescription<<std::endl;
}
}
CoUninitialize();
return 0;
}
对于这个问题,我还有点疑惑。能不能帮我解决一下。
用Scrrun.dll(Scripting)枚举文件的问题http://expert.csdn.net/Expert/topic/2948/2948474.xml?temp=.9887506
for(int i = 0; i<(int)FolderPtr->Files->Count; i++)
{
VARIANT var;
var.vt = VT_I4;
var.lVal = i;
FileColPtr = FolderPtr->Files;
hr = FileColPtr->get_Item(var,&FilePtr);
}
1.这种方法取FilePtr的时候VT应该取怎么样的,上面我能想到的VT都用了,就是不行
2.
IUnknown *pUnk=NULL;
HRESULT hr = files->get__NewEnum(&pUnk);
如果import的时候不用raw_interfaces_only
还有一个属性file->_NewEnum;
这个_NewEnum在tlh文件里面显示是IUnknown接口,但是后面
CComPtr<IEnumVARIANT> pEnum;
hr = pUnk->QueryInterface(IID_IEnumVARIANT,(void**)&pEnum);
我改成
IUnknownPtr pUnk;
pUnk = FolderPtr->Files->_NewEnum;
调试的时候会UnHandle Exception。直接运行没有问题,怎么回事。
谢谢解答,原贴已经结了,所以直接问了。^_^
另外能不能说一下
一个DWORD,怎么转换成线程函数的指针?我想应该是类似下面,但是我做的错了
typedef DWORD (CALLBACK ThreadProc)(LPVOID pParam);
DWORD pPointer;
ThreadProc pProc;
pProc = static_cast<ThreadProc>(pPointer)(LPVOID pParam);