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 ;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值