none
Wrapper les api win32 RRS feed

  • Discussion générale

  • Bonjour,

    J'essaye de porter un sdk écrit en C/C++ qui utilise bien évidemment l'api win32 et je me demandais si ce serait théoriquement possible de wrapper certaines fonctions (genre CreateFile) avec les api winrt.
    Prenons l'exemple de CreateFile justement : 

    HANDLE WINAPI CreateFile(
      __in      LPCTSTR lpFileName,
      __in      DWORD dwDesiredAccess,
      __in      DWORD dwShareMode,
      __in_opt  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
      __in      DWORD dwCreationDisposition,
      __in      DWORD dwFlagsAndAttributes,
      __in_opt  HANDLE hTemplateFile
    )
    {
        String^ filename = ref new String(lpFileName);
    	StorageFolder^ item = KnownFolders::PicturesLibrary;
    	StorageFileRetrievalOperation^ createStorageFileOp = item->CreateFileAsync(filename);
     
    	createStorageFileOp->Completed = ref new AsyncOperationCompletedHandler<StorageFile^>(
    	[](IAsyncOperation<StorageFile^>^ asyncOp)
    	{
    		StorageFile^ storageFile = asyncOp->GetResults();
    	});
    	createStorageFileOp.Start();
    }

    Est ce qu'il serait possible par exemple en fonction des différents paramètres du CreateFile de créer le StorageFile et les différents streams, puis de les mettre dans une structure quelconque et de caster le pointeur en HANDLE. Ensuite si on veut faire un WriteFile ou un autre truc, on recaste le HANDLE vers notre structure et on effectue l'opération qui va bien.
    Ca semble plausible ou le fait que tout soit asynchrone m'empèche de faire çà ?

    • Type modifié Ciprian Duduiala lundi 11 juin 2012 07:14 attente de feedback
    • Déplacé Florin Ciuca vendredi 7 septembre 2012 11:35 (Origine :Développement d’applications de style Metro pour Windows 8)
    mardi 5 juin 2012 21:11

Toutes les réponses

  • Bonjour Vincent,

    Je ne vois qu'une seule solution immédiate à ce problème, cela consisterait à utiliser une primitive de synchronisation pour attendre la fin des appels winrt avant de sortir de ta méthode CreateFile. Je ne recommanderai pas cette méthode car la raison première de l'apparition des apis asynchrone est justement de ne pas bloquer le threads  (notamment le thread ui) afin de garantir une meilleur fluidité du système (crucial pour les interfaces tactiles). Alors bien sûr il serait possible de décider de ne jamais appeler ce sdk "synchronisé" depuis le thread ui mais bien depuis un threadpool. Cependant, cette piste me semble bancale d'avance.

    Sur ce scénario et selon mon opinion il serait préférable d'embrasser le modèle asynchrone de winRT en faisant légèrement évoluer l'API car même si cela va alourdir considérablement le portage le gain sera surement très profitable. A ce sujet avez-vous regardé cet article MSDN http://msdn.microsoft.com/en-us/library/hh750082(v=vs.110).aspx ?

    Bon courage !


    Cyprien Autexier

    mercredi 6 juin 2012 00:26