Windows 7 Jump List

Just starting out? Need help? Post your questions and find answers here.
cas
Enthusiast
Enthusiast
Posts: 597
Joined: Mon Nov 03, 2008 9:56 pm

Windows 7 Jump List

Post by cas »

Is it possible to create custom jump list with COM in purebasic? I tried converting some code from here but i encountered a problem already on first line in first procedure :shock: with CoCreateInstance(), last parameter needs to be processed by IID_PPV_ARGS() but quick search through PB forums gives this thread. :cry:

Are there any workarounds to create jump list with purebasic ?
Thanks
User avatar
mk-soft
Always Here
Always Here
Posts: 6207
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Post by mk-soft »

Will you create a com-dll or call a com-object.
For use com-object search COMate or use this

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
P.S. for virtual table(jump list) show Interfaces on PB-Help
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
cas
Enthusiast
Enthusiast
Posts: 597
Joined: Mon Nov 03, 2008 9:56 pm

Post by cas »

Thanks for reply.
I want to call COM-object in my exe application. I already have all interfaces, looks like mback2k already converted it here but his code, like mine, is not working, code fails on CoCreateInstance(). :(
User avatar
mk-soft
Always Here
Always Here
Posts: 6207
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Post by mk-soft »

Comobject you would like to use which. Needed some code.
IID is allways a 16 byte indentifer.
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
SFSxOI
Addict
Addict
Posts: 2970
Joined: Sat Dec 31, 2005 5:24 pm
Location: Where ya would never look.....

Post by SFSxOI »

Maybe some pointers here > http://www.codeproject.com/KB/vista/Sev ... Lists.aspx <creates a jump list from scratch using C++ but looks convertable to PureBasic maybe, but some COM involved in selecting from the Jump List but not creating it.
cas
Enthusiast
Enthusiast
Posts: 597
Joined: Mon Nov 03, 2008 9:56 pm

Post by cas »

mk-soft wrote:Needed some code.
You can find code example on page which i linked in first post in this thread.
Thanks

Ok, here is code only from that same page:

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;

}
Post Reply