句柄(标准输出句柄),L“\n”,1,NULL,NULL); 对于(i=0;ilpVtbl->释放(psv); 如果(pfv) pfv->lpVtbl->放行(pfv); 如果(ppf) ppf->lpVtbl->发布(ppf); 如果(磅/平方英寸) psi->lpVtbl->释放(psi); 国际单项体育联合会 psb->lpVtbl->发布(psb); } } } 清污干管: if(pEnumVar) pEnumVar->lpVtbl->释放(pEnumVar); 如果(punkEnum) punkEnum->lpVtbl->发布(punkEnum); 如果(psw) psw->lpVtbl->发布(psw); 系统(“暂停”); } coninitialize(); 返回0; }

句柄(标准输出句柄),L“\n”,1,NULL,NULL); 对于(i=0;ilpVtbl->释放(psv); 如果(pfv) pfv->lpVtbl->放行(pfv); 如果(ppf) ppf->lpVtbl->发布(ppf); 如果(磅/平方英寸) psi->lpVtbl->释放(psi); 国际单项体育联合会 psb->lpVtbl->发布(psb); } } } 清污干管: if(pEnumVar) pEnumVar->lpVtbl->释放(pEnumVar); 如果(punkEnum) punkEnum->lpVtbl->发布(punkEnum); 如果(psw) psw->lpVtbl->发布(psw); 系统(“暂停”); } coninitialize(); 返回0; },c,winapi,com,windows-shell,C,Winapi,Com,Windows Shell,有什么想法吗?提前谢谢 您不能从32位进程在64位操作系统上调用Explorer API,而期望返回64位信息(反之亦然) 因此,编译为32位的代码仅适用于32位的控制面板扩展(在我的64位Windows上,我有“Java”、“Flash Player”、“Quick Time”和“Mail”等),但不适用于64位扩展(64位安装中的绝大多数扩展,尤其是Windows提供的扩展) 但奇怪的是,它似乎起作用了,根本不该起作用 无论如何,要解决您的问题,只需将其编译为64位(x64)。您的代码是否有

有什么想法吗?提前谢谢

您不能从32位进程在64位操作系统上调用Explorer API,而期望返回64位信息(反之亦然)

因此,编译为32位的代码仅适用于32位的控制面板扩展(在我的64位Windows上,我有“Java”、“Flash Player”、“Quick Time”和“Mail”等),但不适用于64位扩展(64位安装中的绝大多数扩展,尤其是Windows提供的扩展)

但奇怪的是,它似乎起作用了,根本不该起作用


无论如何,要解决您的问题,只需将其编译为64位(x64)。

您的代码是否有可能在64位Windows中作为32位进程运行?Explorer只支持了这一点。很难猜到你是如何编译这个程序的,它被错误地覆盖着。@ HANSPASANT-代码编译好了,但是它是C,不是C++(你还需要链接到SLWAPI。LIB)。当编译为x64时,它可以100%正常工作。@SimonMourier-它确实可以在64位Windows上以32位运行。但为什么这会带来不同呢?我想我可以不再问了,试试看:P@SimonMourier-哦,哇,它确实有用。好啊我在Explorer中不知道这一点,只是部分支持来自32位应用程序的调用来处理这类事情。接下来,我将测试ShellExecuteEx和SHGetFileInfo,并确保它们现在也以相同的方式工作!谢谢你堆。嗯,一些文档会很好-因为事实上,所有调用都返回S_OK,或者根据调用返回等效值。事实上,我确实希望它能起作用,因为我找不到任何东西表明它不起作用。但是我发现了一个困难的方法:P但是是的,在64位系统上使用64位确实解决了这个问题。事实上,没有记录这个问题并不意味着它应该工作,相反:它没有记录,因此,没有理由它应该工作。资源管理器都是基于COM的。以下是关于它的一般链接:
#include <tchar.h>
#include <Windows.h>
#include <Shlwapi.h>
#include <ShlObj.h>
#include <strsafe.h>

int _tmain( int argc, _TCHAR* argv[] )
{
    if ( !SUCCEEDED( CoInitialize( NULL ) ) )
        return 1;

    system( "PAUSE" );

    IShellWindows *psw = NULL;
    IUnknown *punkEnum = NULL;
    IEnumVARIANT *pEnumVar = NULL;
    HRESULT hr = 0;

    while ( 1 )
    {
        if ( SUCCEEDED( hr = CoCreateInstance( &CLSID_ShellWindows,
            NULL,
            CLSCTX_ALL,
            &IID_IShellWindows,
            ( LPVOID ) &psw ) ) )
        {
            if ( FAILED( psw->lpVtbl->_NewEnum( psw, ( IUnknown** ) &punkEnum ) ) )
                goto clean_main;

            if ( FAILED( punkEnum->lpVtbl->QueryInterface( punkEnum,
                &IID_IEnumVARIANT,
                ( void** ) &pEnumVar ) ) )
            {
                goto clean_main;
            }

            VARIANT v;
            VariantInit( &v );

            while ( pEnumVar->lpVtbl->Next( pEnumVar, 1, &v, NULL ) == S_OK )
            {
                IShellBrowser *psb = NULL;
                IShellView *psv = NULL;
                IFolderView *pfv = NULL;
                IPersistFolder2 *ppf = NULL;
                IShellItem2  *psi = NULL;
                LPITEMIDLIST pidl = NULL;
                LPWSTR pszParsingName;
                LPWSTR pszName = NULL;
                SFGAOF attributes = 0;
                size_t dwLength = 0;
                size_t dwLengthParsing = 0;

                if ( SUCCEEDED( IUnknown_QueryService( ( IUnknown* ) v.pdispVal,
                    &SID_STopLevelBrowser,
                    &IID_IShellBrowser,
                ( void** ) &psb ) ) )
            {
                hr = psb->lpVtbl->QueryActiveShellView( psb, &psv );
                if ( FAILED( hr ) )
                    goto clean_inner;

                hr = psv->lpVtbl->QueryInterface( psv, &IID_IFolderView, ( void** ) &pfv );
                if ( FAILED( hr ) )
                    goto clean_inner;

                hr = pfv->lpVtbl->GetFolder( pfv, &IID_IPersistFolder2, ( void** ) &ppf );
                if ( FAILED( hr ) )
                    goto clean_inner;

                if ( SUCCEEDED( ppf->lpVtbl->GetCurFolder( ppf, &pidl ) ) )
                {
                    size_t i;
                    size_t cb = 0;
                    byte *pb = NULL;

                    if ( FAILED( hr = SHCreateItemFromIDList( pidl, &IID_IShellItem2, ( void** ) &psi ) ) )
                        goto clean_inner;

                    if ( FAILED( hr = psi->lpVtbl->GetDisplayName( psi, SIGDN_NORMALDISPLAY, &pszName ) ) )
                        goto clean_inner;

                    if ( FAILED( hr = psi->lpVtbl->GetDisplayName( psi, SIGDN_DESKTOPABSOLUTEPARSING, &pszParsingName ) ) )
                        goto clean_inner;

                    if ( FAILED( hr = psi->lpVtbl->GetAttributes( psi, SFGAO_CANLINK, &attributes ) ) )
                        goto clean_inner;

                    if ( FAILED( hr = StringCchLength( pszName, STRSAFE_MAX_CCH, &dwLength ) ) )
                        goto clean_inner;

                    if ( FAILED( hr = StringCchLength( pszParsingName, STRSAFE_MAX_CCH, &dwLengthParsing ) ) )
                        goto clean_inner;

                    cb = ILGetSize( pidl );
                    pb = ( byte* ) pidl;
                    WriteConsole( GetStdHandle( STD_OUTPUT_HANDLE ), pszName, dwLength, NULL, NULL );
                    WriteConsole( GetStdHandle( STD_OUTPUT_HANDLE ), L"\n", 1, NULL, NULL );
                    WriteConsole( GetStdHandle( STD_OUTPUT_HANDLE ), pszParsingName, dwLengthParsing, NULL, NULL );
                    WriteConsole( GetStdHandle( STD_OUTPUT_HANDLE ), L"\n", 1, NULL, NULL );

                    for ( i = 0; i < cb; ++i )
                    {
                        WCHAR szHex[ 4 ];
                        StringCchPrintf( szHex, ARRAYSIZE( szHex ), L"%02X", pb[ i ] );
                        WriteConsole( GetStdHandle( STD_OUTPUT_HANDLE ), szHex, 3, NULL, NULL );
                    }

                    WriteConsole( GetStdHandle( STD_OUTPUT_HANDLE ), L"\n", 1, NULL, NULL );
                    WriteConsole( GetStdHandle( STD_OUTPUT_HANDLE ), L"\n", 1, NULL, NULL );
                }

            clean_inner:
                if ( pszParsingName )
                    CoTaskMemFree( pszParsingName );
                if ( pszName )
                    CoTaskMemFree( pszName );
                if ( psv )
                    psv->lpVtbl->Release( psv );
                if ( pfv )
                    pfv->lpVtbl->Release( pfv );
                if ( ppf )
                    ppf->lpVtbl->Release( ppf );
                if ( psi )
                    psi->lpVtbl->Release( psi );
                if ( psb )
                    psb->lpVtbl->Release( psb );
            }
        }
    }
clean_main:
    if ( pEnumVar )
        pEnumVar->lpVtbl->Release( pEnumVar );
    if ( punkEnum )
        punkEnum->lpVtbl->Release( punkEnum );
    if ( psw )
        psw->lpVtbl->Release( psw );

    system( "PAUSE" );
}
CoUninitialize();
return 0;
}