我在用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
怎么用,我想应该是有个回调函数的

解决方案 »

  1.   

    我晕。那个参数好像只能只文件名字符串传入的。不能以int传入。在VB或脚本中只能以for each 的方法来枚举。不知这个for each在VC中怎么写。晕。
      

  2.   

    原来以为for each也只是简单的以自增int的形式对一个coll进行枚举。
    看来这个想法得改。
      

  3.   

    get__NewEnum()
    先得到IEnumVARIANT,
    然后
    HRESULT Next( 
      unsigned long  celt,              
      VARIANT FAR*  rgVar,              
      unsigned long FAR*  pCeltFetched  
    );
      

  4.   

    #include "stdafx.h"
    #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;
    }
      

  5.   

    To masterz :
        对于这个问题,我还有点疑惑。能不能帮我解决一下。
    用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);