C++ 和 com 創建快捷方式

#include <stdio.h>

#include <objbase.h>
#include <shlobj.h>
#include <shlguid.h>



int sendshort(char *filename,char *folder,char *linkname=NULL){

    char *p=strrchr(filename,'//');
    if(p==NULL) return 0;
    if(linkname==NULL){
        linkname=(p+1);
    }
    
    char Path[1024]={0};
    sprintf(Path,"/"%s/"",filename);


    char workdir[1024]={0};
    sprintf(workdir,"
/"%s/"",filename);
    *(workdir+(p-filename)+1)='/"
';
    *(workdir+(p-filename)+2)=0;



    if (CoInitialize(NULL)!=S_OK)
    {
      return FALSE;
    }


    
    IShellLink*   pISL=NULL;
    IPersistFile* pIPF;

    int hr = CoCreateInstance ( CLSID_ShellLink,
                                NULL,
                                CLSCTX_INPROC_SERVER,
                                IID_IShellLink,
                                (void**) &pISL );

    if(pISL==NULL){
        printf("error");
    }
    
    if(hr==S_OK){
        //printf("%s","CoCreateInstance OK/n");
    }else if(hr==REGDB_E_CLASSNOTREG){
        printf("%s","unreg error!/n");
        return 1;
    }else if(hr==CLASS_E_NOAGGREGATION){
        printf("%s","CLASS_E_NOAGGREGATION!/n");
        return 1;
    }else if(hr==E_NOINTERFACE ){
        printf("%s","E_NOINTERFACE!/n");
        return 1;
    }else{
        printf("error/n");
        return 1;
    }


    hr = pISL->SetPath (Path);
    if (hr!=S_OK){
        printf("%s","SetPath error!/n");
        return 1;
    }

    hr = pISL->SetWorkingDirectory(workdir);
    if (hr!=S_OK){
        printf("%s","SetPath error!/n");
        return 1;
    }


    hr = pISL->QueryInterface ( IID_IPersistFile, (void**) &pIPF );
    if (hr!=S_OK){
        printf("%s","QueryInterface error!/n");
        return 1;
    }
    char linkpath[1024]={0};
    wchar_t wlinkpath[1024]={0};
    
    sprintf(linkpath,"%s//%s.lnk",folder,linkname);
    //printf("%s/n",linkpath);
    MultiByteToWideChar(CP_ACP,0,linkpath,strlen(linkpath)+1,wlinkpath,1024);
    hr = pIPF->Save(wlinkpath, FALSE);
    if (hr!=S_OK){
        wprintf(L"%s/n",wlinkpath);
        printf("%s","Save error!/n");
        return 1;
    }


    pISL->Release();

    CoUninitialize();
    return TRUE;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章