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