Ole Drag/Drop

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
eriansa
Messages : 5
Inscription : ven. 10/sept./2004 7:14

Ole Drag/Drop

Message par eriansa »

Comment on doit ecrire le "Constructor" pour IDataObject???

Code : Tout sélectionner

;Ole Drag/Drop far from finished
;-Structures/Interfaces
Structure Formatetc
  cfFormat.l              ;     // Clipboard format  
  *ptd                    ;          // (NULL)       Target device for rendering
  dwAspect.l              ;     // (DV_CONTENT) How much detail is required for data rendering
  lindex.l                ;       // (-1)         Used when data is split across page boundaries
  tymed.l                 ;        // Storage medium used for data transfer (HGLOBAL, IStream etc)
EndStructure
Structure STGMedium
  tymed.l                 ;
  lpszFileName.l          ;
  *pUnkForRelease         ;
EndStructure
Interface IDropSource
  QueryInterface(a,b)
  AddRef()
  Release()
EndInterface
;-IDataObject Interface
DeclareCDLL GetData(*pFormatEtc,*pmedium);
DeclareCDLL GetDataHere(*pFormatEtc,*pmedium);
DeclareCDLL QueryGetData(*pFormatEtc);
DeclareCDLL GetCanonicalFormatEtc(*pFormatEct,*pFormatEtcOut);
DeclareCDLL SetData(*pFormatEtc,*pmedium,fRelease);
DeclareCDLL EnumFormatEtc(dwDirection,*ppEnumFormatEtc);
DeclareCDLL DAdvise(*pFormatEtc,dwadvf, IAdviseSink,*dw);
DeclareCDLL DUnadvise(dwConnection);
DeclareCDLL EnumDAdvise(*ppEnumAdvise);
;-IDataObject Implementation
;????????????????????????????????????????????????????;
;First of all -> How to construct oDataObject????????;
;The rest of the implementation I think I can manage.;
;????????????????????????????????????????????????????;
Global *pDataObject.IDataObject
Global *pDropSource.IDropSource
Global myFormatetc.Formatetc
Global myStgmed.STGMedium

myFormatetc\cfFormat=#cf_wave
myFormatetc\lindex=-1
;?????myStgmed\tymed=#tymed_hglobal ;?????

;-Initialize OLE
If OleInitialize_(0) <> #S_OK
  MessageRequester("OLE","Unable to initialize OLE") 
Else
  dodragdrop_(*pDataObject,*pDataSource,0,0)
  *pDataObject\Release();
  OleUninitialize_();
EndIf
    
hardy
Messages : 333
Inscription : mer. 02/juin/2004 13:19
Localisation : Tours

Message par hardy »

voir doc SDK (là je pars, pas le temps de coder):

utiliser SHGetDesktopFolder (API de shell32.dll) pour initialiser un object IShellFolder.
puis utiliser la méthode GetUIObjectOf de cet objet pour initialiser l'objet IDataObject.
Note que ces interfaces sont prédéfinies en PB : Il faut les initialiser, mais pas besoin de redéfinir leurs structures.

Pour un exemple d'utilisation d'interfaces, tu peux regarder le sujet "un peu de WMI" que j'avais posté il y a un moment dans la section applications.
eriansa
Messages : 5
Inscription : ven. 10/sept./2004 7:14

Message par eriansa »

utiliser SHGetDesktopFolder (API de shell32.dll) pour initialiser un object IShellFolder.
puis utiliser la méthode GetUIObjectOf de cet objet pour initialiser l'objet IDataObject.
Je m'excuse, mais maintenant je n'y comprend plus rien.
Pourquoi je dois utiliser Shell???
hardy
Messages : 333
Inscription : mer. 02/juin/2004 13:19
Localisation : Tours

Message par hardy »

Un bout de code pour obtenir un IDataObject. Tout n'est pas fini.

Code : Tout sélectionner

Debug OleInitialize_(0); Si 0, pas d'erreur

folder.IShellFolder ;déclare folder comme une interface du type ishellfolder
;mais pour l'instant folder ne pointe vers rien
Debug SHGetDesktopFolder_(@folder) ; Si 0, pas d'erreur

; à partir de là, folder a été initialisé et est utilisable.

dobject.IDataObject ; on déclare dobject comme une interface du
;type IDataObject

;n doit être le nombre d'éléments du tableau
;tableau doit être un tableau de pointeur vers des ITEMIDLIST, chacune
;identifiant un "file object" ou un sous-dossier relatif au dossier 
;parent.
;Chaque ITEMIDLIST doit contenir un SHITEMID suivi d'un 0 (long)

 folder\GetUIObjectOf(hwnd,n,@tableau,?idataobjectriid,0,adresse)
 ;adresse reçoit l'adresse d'une interface IDataObject initialisée
; hwnd doit être l'identifiant de la fenêtre mère.
; ex : hwnd=openwindow(...)
 dobject=adresse
 ;si tout c'est bien passé, dobject est désormais utilisable.
 
 
DataSection
 idataobjectriid: 
 ;0000010E-0000-0000-C000-000000000046
 Data.l $0000010E
 Data.w $0000, $0000
 Data.b $C0, $00, $00, $00, $00, $00, $00, $46
EndDataSection
Faut remplir le tableau...

Mais je n'ai pas trop de temps pour rentrer dans les détails
Il faut que tu te documentes : télécharge la plateforme SDK.
Essaie aussi le forum PB anglais. Peut-être tomberas-tu sur quelqu'un qui a déjà étudié ce qui t'intéresse.
eriansa
Messages : 5
Inscription : ven. 10/sept./2004 7:14

Message par eriansa »

j'ai essaye tous les forums (depuis 2 semaines), vous etes le premier qiu me donne une reponse utilisable...Merci beaucoup!
:D
hardy
Messages : 333
Inscription : mer. 02/juin/2004 13:19
Localisation : Tours

Message par hardy »

Au passage : téléchargement de la plateforme SDK (tout sur windows)
http://www.microsoft.com/msdownload/pla ... k-full.htm
C'est volumineux ! Il faut être en haut débit....
eriansa
Messages : 5
Inscription : ven. 10/sept./2004 7:14

Message par eriansa »

On arrive plus proche....mais pas tout a fait!
Quelq'un peut m'aider d'avancer plus loin?

Code : Tout sélectionner

Structure STRRET
  a.w
  b.l
EndStructure

#S_OK=0

myBrowseInfo.BROWSEINFO
myDataObject.IDataObject

If OpenLibrary(0,"shlwapi.dll")
  pStrRetToStr = IsFunction(0,"StrRetToBufA")
  Debug pStrRetToStr
If OleInitialize_(0) = #S_OK
  PIDL1=shbrowseforfolder_(myBrowseInfo)
  If PIDL1
    folder.IShellFolder
    If SHGetDesktopFolder_(@folder) = #S_OK
      pSTRRET.STRRET
      If folder\GetDisplayNameOf(PIDL1,#SHGDN_NORMAL,@pSTRRET) = #S_OK
        strName.s=Space(255)
        CallFunctionFast(pStrRetToStr,pSTRRET,PIDL1,@strName)
        MessageRequester("OLE",strName)
        ptrDataObject=0
        If folder\GetUIObjectOf(hwnd,1,@PIDL1,?idataobjectriid,0,@ptrDataObject) =#S_OK
          If ptrDataObject
            myDataObject=ptrDataObject
            MessageRequester("OLE-DataObject","I got myself a DataObject pointer->"+Str(ptrDataObject))
            MessageRequester("And now?","How to link the methods of IDataObject to my functions?"+Chr(10)+Chr(13)+"p.e. GetData(), SetData() etc...")
          EndIf
          
        EndIf
      EndIf
    EndIf
  EndIf
EndIf
EndIf

DataSection 
idataobjectriid: 
 ;0000010E-0000-0000-C000-000000000046 
Data.l $0000010E 
Data.w $0000, $0000 
Data.b $C0, $00, $00, $00, $00, $00, $00, $46 
EndDataSection
    
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

j'ai essaye tous les forums (depuis 2 semaines), vous etes le premier qiu me donne une reponse utilisable.
je veux pas polemiquer , mais sur le pure basic a part le forum anglais
et ce forum français , qui sont des forums officiel (fait par Fred)
je vois pas comment t'a fait pour ne pas venir ici pendant les 2 semaines dont tu parle !! :lol: :lol:

faut vraiment faire expres de pas nous trouver !! :lol: :lol: :lol:
eriansa
Messages : 5
Inscription : ven. 10/sept./2004 7:14

Message par eriansa »

je veux pas polemiquer , mais sur le pure basic a part le forum anglais
et ce forum français , qui sont des forums officiel (fait par Fred)
je vois pas comment t'a fait pour ne pas venir ici pendant les 2 semaines dont tu parle !!

faut vraiment faire expres de pas nous trouver !!
Veuillez visiter le forum Anglais et chercher : "OLE drag Drop"... :wink:
Répondre