

Are there any workarounds to create jump list with purebasic ?
Thanks
Code: Select all
;-TOP
; Kommentar : DCOM Object Helper
; Author : mk-soft
; Second Author :
; Datei : ComHelper.pb
; Version : 1.03
; Erstellt : 01.05.2006
; Geändert : 01.07.2006
; -------------------------------------------------------------------
;- Konstanten
#CLSCTX_INPROC_SERVER = $1
#CLSCTX_INPROC_HANDLER = $2
#CLSCTX_LOCAL_SERVER = $4
#CLSCTX_REMOTE_SERVER = $10
#CLSCTX_ALL = (#CLSCTX_INPROC_SERVER|#CLSCTX_INPROC_HANDLER|#CLSCTX_LOCAL_SERVER|#CLSCTX_REMOTE_SERVER)
; -------------------------------------------------------------------
;- Strukturen
; -------------------------------------------------------------------
; Globale Variablen
Global LastError.l
Global LastMessage.s
; -------------------------------------------------------------------
CompilerIf Defined(FormatMessage, #PB_Procedure) = #False
Procedure.s FormatMessage(ErrorNumber.l)
Protected *Buffer, len, result.s
len = FormatMessage_(#FORMAT_MESSAGE_ALLOCATE_BUFFER|#FORMAT_MESSAGE_FROM_SYSTEM,0,ErrorNumber,0,@*Buffer,0,0)
If len
result = PeekS(*Buffer, len - 2)
LocalFree_(*Buffer)
ProcedureReturn result
Else
ProcedureReturn "Errorcode: " + Hex(ErrorNumber)
EndIf
EndProcedure
CompilerEndIf
; -------------------------------------------------------------------
Procedure CreateObject(Object.s, CLSTYPE.l = #CLSCTX_LOCAL_SERVER | #CLSCTX_INPROC_SERVER)
Protected hr.l, CLSID.GUID, pCf.IClassFactory, *Object.IDispatch
LastError = 0
LastMessage = ""
hr = CoInitialize_(0)
If hr <> #S_OK And hr <> #S_FALSE
LastError = hr
LastMessage = "Error CoInitialize: " + FormatMessage(hr)
End
EndIf
hr = CLSIDFromProgID_(Object, CLSID.GUID)
If hr <> #S_OK
LastError = hr
LastMessage = "Error CLSIDFromProgID: " + FormatMessage(hr)
ProcedureReturn 0
EndIf
hr = CoGetClassObject_(@CLSID, CLSTYPE, #Null, ?IID_IClassFactory, @pCf.IClassFactory)
If hr <> #S_OK
LastError = hr
LastMessage = "Error CoGetClassObject: " + FormatMessage(hr)
ProcedureReturn 0
EndIf
hr = pCf\CreateInstance(#Null, ?IID_IDispatch, @*Object.IDispatch)
pCf\Release()
If hr <> #S_OK
LastError = hr
LastMessage = "Error CreateInstance: " + FormatMessage(hr)
ProcedureReturn 0
Else
ProcedureReturn *Object
EndIf
EndProcedure
; -------------------------------------------------------------------
Procedure ReleaseObject(*Object.IDispatch)
If *Object
*Object\Release()
EndIf
EndProcedure
; ---------------------------------------------------------
;- DataSection IID
DataSection
IID_NULL: ; {00000000-0000-0000-0000-000000000000}
Data.l $00000000
Data.w $0000, $0000
Data.b $00, $00, $00, $00, $00, $00, $00, $00
IID_IUnknown : ; {00000000-0000-0000-C000-000000000046}'
Data.l $00000000
Data.w $0000, $0000
Data.b $C0, $00, $00 , $00 , $00, $00 , $00 , $46
IID_IDispatch:
Data.l $00020400
Data.w $0000, $0000
Data.b $C0,$00,$00,$00,$00,$00,$00,$46
IID_IClassFactory:
Data.l $00000001
Data.w $0000, $0000
Data.b $C0, $0, $0, $0, $0, $0, $0, $46
EndDataSection
You can find code example on page which i linked in first post in this thread.mk-soft wrote:Needed some code.
Code: Select all
void CreateJumpList()
{
ICustomDestinationList *pcdl;
HRESULT hr = CoCreateInstance
(CLSID_DestinationList,
NULL, CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&pcdl));
if (SUCCEEDED(hr))
{
hr = pcdl->SetAppID(c_szAppID);
if (SUCCEEDED(hr))
{
UINT uMaxSlots;
IObjectArray *poaRemoved;
hr = pcdl->BeginList
(&uMaxSlots, IID_PPV_ARGS(&poaRemoved));
if (SUCCEEDED(hr))
{
hr = _AddCategoryToList(pcdl, poaRemoved);
if (SUCCEEDED(hr))
{
pcdl->CommitList();
}
poaRemoved->Release();
}
}
}
}
// This is the helper function that actually
//appends the items to a collection object HRESULT
_AddCategoryToList(ICustomDestinationList *pcdl,
IObjectArray *poaRemoved)
{
IObjectCollection *poc;
HRESULT hr = CoCreateInstance
(CLSID_EnumerableObjectCollection,
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&poc));
if (SUCCEEDED(hr))
{
for (UINT i = 0; i < ARRAYSIZE(c_rgpszFiles); i++)
{
IShellItem *psi;
if (SUCCEEDED(SHCreateItemInKnownFolder(
FOLDERID_Documents,
KF_FLAG_DEFAULT,
c_rgpszFiles[i],
IID_PPV_ARGS(&psi))))
{
if(!_IsItemInArray(psi, poaRemoved))
{
poc->AddObject(psi);
}
psi->Release();
}
}
IObjectArray *poa;
hr = poc->QueryInterface(IID_PPV_ARGS(&poa));
if (SUCCEEDED(hr))
{
pcdl->AppendCategory(L"Custom category", poa);
poa->Release();
}
poc->Release();
}
return hr;
}