// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_FRAME_MODULE_UTILS_H_
#define CHROME_FRAME_MODULE_UTILS_H_

#include <ObjBase.h>
#include <windows.h>

class DllRedirector {
 public:
  // Attempts to register a window class under a well known name and appends to
  // its extra data a handle to the current module. Will fail if the window
  // class is already registered. This is intended to be called from DllMain
  // under PROCESS_ATTACH.
  static bool DllRedirector::RegisterAsFirstCFModule();

  // Unregisters the well known window class if we registered it earlier.
  // This is intended to be called from DllMain under PROCESS_DETACH.
  static void DllRedirector::UnregisterAsFirstCFModule();

  // Helper function that extracts the HMODULE parameter from our well known
  // window class.
  static HMODULE GetFirstCFModule();

  // Helper function to return the DllGetClassObject function pointer from
  // the given module. On success, the return value is non-null and module
  // will have had its reference count incremented.
  static LPFNGETCLASSOBJECT GetDllGetClassObjectPtr(HMODULE module);

 private:
  // Use this to keep track of whether or not we have registered the window
  // class in this module.
  static ATOM atom_;

  friend class ModuleUtilsTest;
};

#endif  // CHROME_FRAME_MODULE_UTILS_H_