Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 如何创建c+中shell使用的IconHandler+;? 我试图在C++中编写一个图标处理程序,但我有一些问题要做。我跟着那辆车从_Windows_Shell_Icons_Handler_Explorer - Fatal编程技术网

Windows 如何创建c+中shell使用的IconHandler+;? 我试图在C++中编写一个图标处理程序,但我有一些问题要做。我跟着那辆车从

Windows 如何创建c+中shell使用的IconHandler+;? 我试图在C++中编写一个图标处理程序,但我有一些问题要做。我跟着那辆车从,windows,shell,icons,handler,explorer,Windows,Shell,Icons,Handler,Explorer,本教程的不同之处在于,我想使用visual studio向导(2013)中的ATL项目编写dll。因此,我创建了一个新的ATL项目,并为此项目创建了一个COM+1类(这是标题的代码) 问题是,我的dll是附加的,但之后立即分离 我将在下面给出一些代码和更多解释: extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) { if (dwReason == DLL_PROCE

本教程的不同之处在于,我想使用visual studio向导(2013)中的ATL项目编写dll。因此,我创建了一个新的ATL项目,并为此项目创建了一个COM+1类(这是标题的代码)

问题是,我的dll是附加的,但之后立即分离

我将在下面给出一些代码和更多解释:

extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
    if (dwReason == DLL_PROCESS_ATTACH)
    {
        _AtlModule.InitLibId();
        //_AtlModule.RegisterAppId();
    }

    return _AtlModule.DllMain(dwReason, lpReserved);;
}
这是我的dll的入口点。我在这个切入点上做了很多尝试和测试。我试图编写一些dwReason的登录函数,该函数只有在编译时才启动。一次使用属性DLL\u PROCESS\u ATTACH,另一次使用属性DLL\u PROCESS\u DETACH。在此之后,即使我将注册表设置为在文件的IconHandler中调用此dll,也无法工作

我会把我的dllmain.h、handler.h、idl文件和rgs文件放进去。如果你需要更多的代码来帮助我,我会稍后再放

德勒曼

class CQIIconDllModule : public ATL::CAtlDllModuleT< CQIIconDllModule >
{
public :
    DECLARE_LIBID(LIBID_QIIconDllLib)
    DECLARE_REGISTRY_APPID_RESOURCEID(IDR_QIHANDLER, "{7FFCD43D-9EB3-4F76-940C-98C333FB8A99}")
};

extern class CQIIconDllModule _AtlModule;
rgs文件:

HKCR
{
    NoRemove CLSID
    {
        ForceRemove {D32D9690-E6A4-44D8-A949-5F39D35269F8} = s 'CompReg Class'
        {
            InprocServer32 = s '%MODULE%'
            {
                val ThreadingModel = s 'Apartment'
            }
            TypeLib = s '{17AD604F-FDD1-453C-A2D2-EAD3FCC42AB5}'
            Version = s '1.0'
        }
    }
}
rgs处理程序文件:

HKCR
{
    NoRemove CLSID
    {
        ForceRemove {7FFCD43D-9EB3-4F76-940C-98C333FB8A99} = s 'QIHandler Class'
        {
            InprocServer32 = s '%MODULE%'
            {
                val ThreadingModel = s 'Apartment'
            }
            TypeLib = s '{17AD604F-FDD1-453C-A2D2-EAD3FCC42AB5}'
            Version = s '1.0'
        }
    }


    NoRemove qifile
    {
        NoRemove DefaultIcon = s '%%1'
        NoRemove ShellEx
        {
            ForceRemove IconHandler = s '{7FFCD43D-9EB3-4F76-940C-98C333FB8A99}'
        }
    }
}
我希望我的解释是清楚的。如果你需要更多的信息来回答我的问题,告诉我我会尽快回答。我将感谢你花时间来帮助我

弗洛里安

编辑:

看我的测试。cpp

    BOOL ret = false;
    FILE *file; 
    fopen_s(&file, "test.txt","a+"); /* apend file (add text to 
        a file or create a file if it does not exist.*/ 
    if (dwReason == DLL_PROCESS_ATTACH)
    {
        fprintf(file,"%s","Initialize AtlModule\n"); /*writes*/ 
        _AtlModule.InitLibId();
        HRESULT hr = _AtlModule.RegisterAppId();
        if (SUCCEEDED(hr))
        {
            fprintf(file,"%s","Registrer app succeeded \n"); /*writes*/ 
            hr = _AtlModule.RegisterServer(TRUE, &CLSID_QIHandler);
            if (SUCCEEDED(hr))
            {
                fprintf(file,"%s","RegisterServer succeeded \n"); /*writes*/ 
                hr = _AtlModule.UpdateRegistryAppId(TRUE);
                if (SUCCEEDED(hr))
                {
                    fprintf(file,"%s","UpdateRegistryAppId succeeded \n"); /*writes*/ 
                    ret = true;
                }
            }
        }

    }
#ifdef _DEBUG
    else if (dwReason == DLL_PROCESS_DETACH)
    {
        _AtlModule.UpdateRegistryAppId(FALSE);
        _AtlModule.Term();
    }//*/
#endif
    if (dwReason == DLL_PROCESS_DETACH && lpReserved != NULL)
    {
        ret = true;
    }
    else if (dwReason == DLL_PROCESS_DETACH)
    {
        fprintf(file,"%s","Execption ! \n"); /*writes*/ 
    }

    fclose(file); /*done!*/ 
    return ret;
my test.txt中的结果:

Initialize AtlModule
Registrer app succeeded 
RegisterServer succeeded 
UpdateRegistryAppId succeeded 
Execption ! 

这里有人有想法吗?

我没有找到任何解决方案来使用我的解决方案。所以我用C#编写我的处理程序,即使这不是最好的方法,因为它调用了一些本机函数

我使用了代码项目中的以下教程:

我希望本教程能帮助一些人。如果有人能回答我的预览问题,我会很高兴知道我必须做什么

弗洛里安

    BOOL ret = false;
    FILE *file; 
    fopen_s(&file, "test.txt","a+"); /* apend file (add text to 
        a file or create a file if it does not exist.*/ 
    if (dwReason == DLL_PROCESS_ATTACH)
    {
        fprintf(file,"%s","Initialize AtlModule\n"); /*writes*/ 
        _AtlModule.InitLibId();
        HRESULT hr = _AtlModule.RegisterAppId();
        if (SUCCEEDED(hr))
        {
            fprintf(file,"%s","Registrer app succeeded \n"); /*writes*/ 
            hr = _AtlModule.RegisterServer(TRUE, &CLSID_QIHandler);
            if (SUCCEEDED(hr))
            {
                fprintf(file,"%s","RegisterServer succeeded \n"); /*writes*/ 
                hr = _AtlModule.UpdateRegistryAppId(TRUE);
                if (SUCCEEDED(hr))
                {
                    fprintf(file,"%s","UpdateRegistryAppId succeeded \n"); /*writes*/ 
                    ret = true;
                }
            }
        }

    }
#ifdef _DEBUG
    else if (dwReason == DLL_PROCESS_DETACH)
    {
        _AtlModule.UpdateRegistryAppId(FALSE);
        _AtlModule.Term();
    }//*/
#endif
    if (dwReason == DLL_PROCESS_DETACH && lpReserved != NULL)
    {
        ret = true;
    }
    else if (dwReason == DLL_PROCESS_DETACH)
    {
        fprintf(file,"%s","Execption ! \n"); /*writes*/ 
    }

    fclose(file); /*done!*/ 
    return ret;
Initialize AtlModule
Registrer app succeeded 
RegisterServer succeeded 
UpdateRegistryAppId succeeded 
Execption !