Win32 API 日本語リファレンス
ホームSystem.LibraryLoader › LoadModule

LoadModule

関数
アプリケーションモジュールを読み込んで実行する。
DLLKERNEL32.dll呼出規約winapi対応OSWindows XP 以降

シグネチャ

// KERNEL32.dll
#include <windows.h>

DWORD LoadModule(
    LPCSTR lpModuleName,
    void* lpParameterBlock
);

パラメーター

名前方向説明
lpModuleNameLPCSTRin

実行するアプリケーションのファイル名。パスを指定する場合は、必ずスラッシュ (/) ではなくバックスラッシュ (\) を使用してください。lpModuleName パラメーターにディレクトリパスが含まれていない場合、システムは次の順序で実行可能ファイルを検索します。

  1. アプリケーションが読み込まれたディレクトリ。
  2. カレントディレクトリ。
  3. システムディレクトリ。このディレクトリのパスを取得するには、 GetSystemDirectory 関数を使用します。
  4. 16 ビットシステムディレクトリ。このディレクトリのパスを取得する関数はありませんが、検索の対象になります。このディレクトリの名前は System です。
  5. Windows ディレクトリ。このディレクトリのパスを取得するには、 GetWindowsDirectory 関数を使用します。
  6. PATH 環境変数に列挙されているディレクトリ。
lpParameterBlockvoid*in

新しいアプリケーションのパラメーターブロックを定義する、アプリケーション定義の LOADPARMS32 構造体へのポインター。

lpCmdLine を除く未使用のメンバーはすべて NULL に設定します。lpCmdLine は、使用しない場合でも null 終端文字列を指している必要があります。詳細については「解説」を参照してください。

戻り値の型: DWORD

公式ドキュメント

アプリケーションを読み込んで実行するか、既存のアプリケーションの新しいインスタンスを作成します。

戻り値

関数が成功した場合、戻り値は 31 より大きい値になります。

関数が失敗した場合、戻り値はエラー値であり、次のいずれかの値になることがあります。

リターンコード/値 説明
0
システムのメモリまたはリソースが不足しています。
ERROR_BAD_FORMAT
11L
.exe ファイルが無効です。
ERROR_FILE_NOT_FOUND
2L
指定されたファイルが見つかりませんでした。
ERROR_PATH_NOT_FOUND
3L
指定されたパスが見つかりませんでした。

解説(Remarks)

LOADPARMS32 構造体は次の形式を持ちます。

typedef struct tagLOADPARMS32 { 
  LPSTR lpEnvAddress;  // address of environment strings 
  LPSTR lpCmdLine;     // address of command line 
  LPSTR lpCmdShow;     // how to show new program 
  DWORD dwReserved;    // must be zero 
} LOADPARMS32;
メンバー 意味
lpEnvAddress 新しいプロセスの環境文字列を供給する、null 終端文字列の配列へのポインター。配列の最後のエントリは NULL の値を持ちます。このパラメーターに NULL を指定すると、新しいプロセスは呼び出し元プロセスと同じ環境で開始されます。
lpCmdLine 正しく整形されたコマンドラインを含む Pascal スタイルの文字列へのポインター。文字列の先頭バイトには文字列のバイト数が格納されます。残りの部分には、子プロセスの名前を除いたコマンドライン引数が格納されます。コマンドライン引数がない場合、このパラメーターは長さ 0 の文字列を指している必要があります。NULL にすることはできません。
lpCmdShow 2 つの WORD 値を含む構造体へのポインター。最初の値は常に 2 に設定する必要があります。2 番目の値はアプリケーションウィンドウの表示方法を指定し、 CreateProcess 関数に渡される STARTUPINFO 構造体の wShowWindow メンバーを供給するために使用されます。指定可能な値の一覧については、 ShowWindow 関数の nCmdShow パラメーターの説明を参照してください。
dwReserved このパラメーターは予約されています。0 にする必要があります。

アプリケーションでは、 LoadModule ではなく CreateProcess 関数を使用してください。 LoadModule 関数は、次のようにパラメーターを構成して CreateProcess を呼び出します。

CreateProcess のパラメーター 使用される引数
lpszApplicationName lpModuleName
lpszCommandLine lpParameterBlock.lpCmdLine
lpProcessAttributes NULL
lpThreadAttributes NULL
bInheritHandles FALSE
dwCreationFlags 0
lpEnvironment lpParameterBlock.lpEnvAddress
lpCurrentDirectory NULL
lpStartupInfo 構造体は 0 に初期化されます。cb メンバーには構造体のサイズが設定されます。wShowWindow メンバーには lpParameterBlock.lpCmdShow の 2 番目のワードの値が設定されます。
lpProcessInformation.hProcess ハンドルは直ちに閉じられます。
lpProcessInformation.hThread ハンドルは直ちに閉じられます。
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での呼び出し定義

// KERNEL32.dll
#include <windows.h>

DWORD LoadModule(
    LPCSTR lpModuleName,
    void* lpParameterBlock
);
[DllImport("KERNEL32.dll", ExactSpelling = true)]
static extern uint LoadModule(
    [MarshalAs(UnmanagedType.LPStr)] string lpModuleName,   // LPCSTR
    IntPtr lpParameterBlock   // void*
);
<DllImport("KERNEL32.dll", ExactSpelling:=True)>
Public Shared Function LoadModule(
    <MarshalAs(UnmanagedType.LPStr)> lpModuleName As String,   ' LPCSTR
    lpParameterBlock As IntPtr   ' void*
) As UInteger
End Function
' lpModuleName : LPCSTR
' lpParameterBlock : void*
Declare PtrSafe Function LoadModule Lib "kernel32" ( _
    ByVal lpModuleName As String, _
    ByVal lpParameterBlock As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

LoadModule = ctypes.windll.kernel32.LoadModule
LoadModule.restype = wintypes.DWORD
LoadModule.argtypes = [
    wintypes.LPCSTR,  # lpModuleName : LPCSTR
    ctypes.POINTER(None),  # lpParameterBlock : void*
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('KERNEL32.dll')
LoadModule = Fiddle::Function.new(
  lib['LoadModule'],
  [
    Fiddle::TYPE_VOIDP,  # lpModuleName : LPCSTR
    Fiddle::TYPE_VOIDP,  # lpParameterBlock : void*
  ],
  -Fiddle::TYPE_INT)
#[link(name = "kernel32")]
extern "system" {
    fn LoadModule(
        lpModuleName: *const u8,  // LPCSTR
        lpParameterBlock: *mut ()  // void*
    ) -> u32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("KERNEL32.dll")]
public static extern uint LoadModule([MarshalAs(UnmanagedType.LPStr)] string lpModuleName, IntPtr lpParameterBlock);
"@
$api = Add-Type -MemberDefinition $sig -Name 'KERNEL32_LoadModule' -Namespace Win32 -PassThru
# $api::LoadModule(lpModuleName, lpParameterBlock)
#uselib "KERNEL32.dll"
#func global LoadModule "LoadModule" sptr, sptr
; LoadModule lpModuleName, lpParameterBlock   ; 戻り値は stat
; lpModuleName : LPCSTR -> "sptr"
; lpParameterBlock : void* -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
#uselib "KERNEL32.dll"
#cfunc global LoadModule "LoadModule" str, sptr
; res = LoadModule(lpModuleName, lpParameterBlock)
; lpModuleName : LPCSTR -> "str"
; lpParameterBlock : void* -> "sptr"
; DWORD LoadModule(LPCSTR lpModuleName, void* lpParameterBlock)
#uselib "KERNEL32.dll"
#cfunc global LoadModule "LoadModule" str, intptr
; res = LoadModule(lpModuleName, lpParameterBlock)
; lpModuleName : LPCSTR -> "str"
; lpParameterBlock : void* -> "intptr"
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	kernel32 = windows.NewLazySystemDLL("KERNEL32.dll")
	procLoadModule = kernel32.NewProc("LoadModule")
)

// lpModuleName (LPCSTR), lpParameterBlock (void*)
r1, _, err := procLoadModule.Call(
	uintptr(unsafe.Pointer(windows.BytePtrFromString(lpModuleName))),
	uintptr(lpParameterBlock),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // DWORD
function LoadModule(
  lpModuleName: PAnsiChar;   // LPCSTR
  lpParameterBlock: Pointer   // void*
): DWORD; stdcall;
  external 'KERNEL32.dll' name 'LoadModule';
result := DllCall("KERNEL32\LoadModule"
    , "AStr", lpModuleName   ; LPCSTR
    , "Ptr", lpParameterBlock   ; void*
    , "UInt")   ; return: DWORD
●LoadModule(lpModuleName, lpParameterBlock) = DLL("KERNEL32.dll", "dword LoadModule(char*, void*)")
# 呼び出し: LoadModule(lpModuleName, lpParameterBlock)
# lpModuleName : LPCSTR -> "char*"
# lpParameterBlock : void* -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "kernel32" fn LoadModule(
    lpModuleName: [*c]const u8, // LPCSTR
    lpParameterBlock: ?*anyopaque // void*
) callconv(std.os.windows.WINAPI) u32;
proc LoadModule(
    lpModuleName: cstring,  # LPCSTR
    lpParameterBlock: pointer  # void*
): uint32 {.importc: "LoadModule", stdcall, dynlib: "KERNEL32.dll".}
pragma(lib, "kernel32");
extern(Windows)
uint LoadModule(
    const(char)* lpModuleName,   // LPCSTR
    void* lpParameterBlock   // void*
);
ccall((:LoadModule, "KERNEL32.dll"), stdcall, UInt32,
      (Cstring, Ptr{Cvoid}),
      lpModuleName, lpParameterBlock)
# lpModuleName : LPCSTR -> Cstring
# lpParameterBlock : void* -> Ptr{Cvoid}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
uint32_t LoadModule(
    const char* lpModuleName,
    void* lpParameterBlock);
]]
local kernel32 = ffi.load("kernel32")
-- kernel32.LoadModule(lpModuleName, lpParameterBlock)
-- lpModuleName : LPCSTR
-- lpParameterBlock : void*
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('KERNEL32.dll');
const LoadModule = lib.func('__stdcall', 'LoadModule', 'uint32_t', ['str', 'void *']);
// LoadModule(lpModuleName, lpParameterBlock)
// lpModuleName : LPCSTR -> 'str'
// lpParameterBlock : void* -> 'void *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("KERNEL32.dll", {
  LoadModule: { parameters: ["buffer", "pointer"], result: "u32" },
});
// lib.symbols.LoadModule(lpModuleName, lpParameterBlock)
// lpModuleName : LPCSTR -> "buffer"
// lpParameterBlock : void* -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
uint32_t LoadModule(
    const char* lpModuleName,
    void* lpParameterBlock);
C, "KERNEL32.dll");
// $ffi->LoadModule(lpModuleName, lpParameterBlock);
// lpModuleName : LPCSTR
// lpParameterBlock : void*
// 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
// WINAPI(stdcall): x64 では呼出規約が統一されるため問題なし。x86 では __stdcall 対応のラッパが必要な場合あり。
import com.sun.jna.*;
import com.sun.jna.ptr.*;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;

public interface Kernel32 extends StdCallLibrary {
    Kernel32 INSTANCE = Native.load("kernel32", Kernel32.class);
    int LoadModule(
        String lpModuleName,   // LPCSTR
        Pointer lpParameterBlock   // void*
    );
}
@[Link("kernel32")]
lib LibKERNEL32
  fun LoadModule = LoadModule(
    lpModuleName : UInt8*,   # LPCSTR
    lpParameterBlock : Void*   # void*
  ) : UInt32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef LoadModuleNative = Uint32 Function(Pointer<Utf8>, Pointer<Void>);
typedef LoadModuleDart = int Function(Pointer<Utf8>, Pointer<Void>);
final LoadModule = DynamicLibrary.open('KERNEL32.dll')
    .lookupFunction<LoadModuleNative, LoadModuleDart>('LoadModule');
// lpModuleName : LPCSTR -> Pointer<Utf8>
// lpParameterBlock : void* -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function LoadModule(
  lpModuleName: PAnsiChar;   // LPCSTR
  lpParameterBlock: Pointer   // void*
): DWORD; stdcall;
  external 'KERNEL32.dll' name 'LoadModule';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "LoadModule"
  c_LoadModule :: CString -> Ptr () -> IO Word32
-- lpModuleName : LPCSTR -> CString
-- lpParameterBlock : void* -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let loadmodule =
  foreign "LoadModule"
    (string @-> (ptr void) @-> returning uint32_t)
(* lpModuleName : LPCSTR -> string *)
(* lpParameterBlock : void* -> (ptr void) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library kernel32 (t "KERNEL32.dll"))
(cffi:use-foreign-library kernel32)

(cffi:defcfun ("LoadModule" load-module :convention :stdcall) :uint32
  (lp-module-name :string)   ; LPCSTR
  (lp-parameter-block :pointer))   ; void*
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $LoadModule = Win32::API::More->new('KERNEL32',
    'DWORD LoadModule(LPCSTR lpModuleName, LPVOID lpParameterBlock)');
# my $ret = $LoadModule->Call($lpModuleName, $lpParameterBlock);
# lpModuleName : LPCSTR -> LPCSTR
# lpParameterBlock : void* -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

公式の関連項目