C++/CLI : IntPtr to an HWND


I was fed up with always having to write different code for x86 or x64 so I wrote intptr_cast<>.


Still a lot of things to think about here but I wrote those couple of lines as a sample.


I thought this might not only give you ideas but maybe trigger some comments:



// Cheap static_assert


template <bool> class static_assert;


template <> class static_assert<true> {};


 


template <typename T>


T intptr_cast(System::IntPtr intPtr) {


   static_assert< sizeof(T) == sizeof(void *) >();


   return reinterpret_cast<T>(intPtr.ToPointer());


}

(10/15/2007: I changed the code above to use ToPointer())

 


 


 


And a code sample on how to use this: 


 




void Cache::Pin(array<String ^> ^ pathsToPin, PinningBehaviour pinningBehaviour, bool pinSubdirectories, bool asynchronously, IntPtr parentWindow ) {


   LastPinningEventRaised = LastEventRaised::None;


   const wchar_t * * paths = NULL;


   try {


      paths = ConstructSingleNativeBuffer(pathsToPin);


 


      if (!_pinningProgress) {


         _pinningProgress = new Progress(this, ProgressSource::Pinning);


      }


 


      Tif(_cache->Pin(intptr_cast<HWND>(parentWindow),


                      paths,


                      pathsToPin->Length,


                      pinSubdirectories,


                      asynchronously,


                      safe_cast<DWORD>(pinningBehaviour),


                      safe_cast<IOfflineFilesSyncProgress *>(_pinningProgress)));


   } finally {


      delete [] paths;


   }


}


 


Of course, you could use this for HBRUSH, HPEN, HANDLE, …


 


May the force be with you.

Comments (0)