native_library_win.cc revision 201ade2fbba22bfb27ae029f4d23fca6ded109a0
1// Copyright (c) 2009 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "base/native_library.h"
6
7#include <windows.h>
8
9#include "base/file_util.h"
10#include "base/thread_restrictions.h"
11#include "base/utf_string_conversions.h"
12
13namespace base {
14
15typedef HMODULE (WINAPI* LoadLibraryFunction)(const wchar_t* file_name);
16
17NativeLibrary LoadNativeLibraryHelper(const FilePath& library_path,
18                                      LoadLibraryFunction load_library_api) {
19  // LoadLibrary() opens the file off disk.
20  base::ThreadRestrictions::AssertIOAllowed();
21
22  // Switch the current directory to the library directory as the library
23  // may have dependencies on DLLs in this directory.
24  bool restore_directory = false;
25  FilePath current_directory;
26  if (file_util::GetCurrentDirectory(&current_directory)) {
27    FilePath plugin_path = library_path.DirName();
28    if (!plugin_path.empty()) {
29      file_util::SetCurrentDirectory(plugin_path);
30      restore_directory = true;
31    }
32  }
33
34  HMODULE module = (*load_library_api)(library_path.value().c_str());
35  if (restore_directory)
36    file_util::SetCurrentDirectory(current_directory);
37
38  return module;
39}
40
41// static
42NativeLibrary LoadNativeLibrary(const FilePath& library_path) {
43  return LoadNativeLibraryHelper(library_path, LoadLibraryW);
44}
45
46NativeLibrary LoadNativeLibraryDynamically(const FilePath& library_path) {
47  typedef HMODULE (WINAPI* LoadLibraryFunction)(const wchar_t* file_name);
48
49  LoadLibraryFunction load_library;
50  load_library = reinterpret_cast<LoadLibraryFunction>(
51      GetProcAddress(GetModuleHandle(L"kernel32.dll"), "LoadLibraryW"));
52
53  return LoadNativeLibraryHelper(library_path, load_library);
54}
55
56// static
57void UnloadNativeLibrary(NativeLibrary library) {
58  FreeLibrary(library);
59}
60
61// static
62void* GetFunctionPointerFromNativeLibrary(NativeLibrary library,
63                                          const char* name) {
64  return GetProcAddress(library, name);
65}
66
67// static
68string16 GetNativeLibraryName(const string16& name) {
69  return name + ASCIIToUTF16(".dll");
70}
71
72}  // namespace base
73