使用 C# returns 空值对 CreateProcess 进行后期绑定
Late binding on CreateProcess with C# returns null value
我正在尝试在 kernel32.dll 中对 CreateProcess 函数使用后期绑定,但是,它 returns 是一个不同于任何其他函数的空值。
这是我用于后期绑定的代码
public abstract class LateBinding
{
[DllImport("kernel32.dll", CharSet = CharSet.Auto, BestFitMapping = false, SetLastError = true), SuppressUnmanagedCodeSecurity()]
private static extern LBHandle LoadLibrary(string fileName);
[DllImport("kernel32.dll"), SuppressUnmanagedCodeSecurity()]
private static extern IntPtr GetProcAddress(LBHandle hModule, string procname);
private Delegate Result = default(Delegate);
public Delegate Call(string library, string method, Type type)
{
LBHandle Lib = LoadLibrary(library);
if (!Lib.IsInvalid && !Lib.IsClosed)
{
Result = Marshal.GetDelegateForFunctionPointer(GetProcAddress(Lib, method), type);
Lib.Close();
}
return Result;
}
}
[SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)]
public sealed class LBHandle : SafeHandleZeroOrMinusOneIsInvalid
{
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool FreeLibrary(IntPtr hModule);
private LBHandle() : base(true) { }
protected override bool ReleaseHandle()
{
return FreeLibrary(handle);
}
}
这就是我调用函数的方式
private delegate bool dCreateProcess(string applicationName, string commandLine, IntPtr processAttributes, IntPtr threadAttributes, bool inheritHandles, uint creationFlags, IntPtr environment, string currentDirectory, ref STARTUP_INFORMATION startupInfo, ref PROCESS_INFORMATION processInformation);
dCreateProcess CreateProcess = Call("kernel32.dll", "CreateProcess", typeof(dCreateProcess)) as dCreateProcess;
kernel32.dll
实际上并没有导出名称为 CreateProcess
的函数入口点 - 它是 CreateProcessA
或在您的情况下 CreateProcessW
用于 unicode(宽)参数。
kernel32 中没有名为CreateProcess
的函数。它有两个版本 CreateProcessA
(ANSI) 和 CreateProcessW
(Unicode)。您可以在 documentation for CreateProcess on MSDN 按钮处看到它。
这不是 CreateProcess
独有的,几乎每个接受字符串的 Win32 API 函数都有一个 A
和一个 W
版本。
以下是您想要的:
dCreateProcess CreateProcess = Call("kernel32.dll", "CreateProcessW", typeof(dCreateProcess)) as dCreateProcess;
另见 What is the difference between CreateProcess and CreateProcessA?
我正在尝试在 kernel32.dll 中对 CreateProcess 函数使用后期绑定,但是,它 returns 是一个不同于任何其他函数的空值。
这是我用于后期绑定的代码
public abstract class LateBinding
{
[DllImport("kernel32.dll", CharSet = CharSet.Auto, BestFitMapping = false, SetLastError = true), SuppressUnmanagedCodeSecurity()]
private static extern LBHandle LoadLibrary(string fileName);
[DllImport("kernel32.dll"), SuppressUnmanagedCodeSecurity()]
private static extern IntPtr GetProcAddress(LBHandle hModule, string procname);
private Delegate Result = default(Delegate);
public Delegate Call(string library, string method, Type type)
{
LBHandle Lib = LoadLibrary(library);
if (!Lib.IsInvalid && !Lib.IsClosed)
{
Result = Marshal.GetDelegateForFunctionPointer(GetProcAddress(Lib, method), type);
Lib.Close();
}
return Result;
}
}
[SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)]
public sealed class LBHandle : SafeHandleZeroOrMinusOneIsInvalid
{
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool FreeLibrary(IntPtr hModule);
private LBHandle() : base(true) { }
protected override bool ReleaseHandle()
{
return FreeLibrary(handle);
}
}
这就是我调用函数的方式
private delegate bool dCreateProcess(string applicationName, string commandLine, IntPtr processAttributes, IntPtr threadAttributes, bool inheritHandles, uint creationFlags, IntPtr environment, string currentDirectory, ref STARTUP_INFORMATION startupInfo, ref PROCESS_INFORMATION processInformation);
dCreateProcess CreateProcess = Call("kernel32.dll", "CreateProcess", typeof(dCreateProcess)) as dCreateProcess;
kernel32.dll
实际上并没有导出名称为 CreateProcess
的函数入口点 - 它是 CreateProcessA
或在您的情况下 CreateProcessW
用于 unicode(宽)参数。
kernel32 中没有名为CreateProcess
的函数。它有两个版本 CreateProcessA
(ANSI) 和 CreateProcessW
(Unicode)。您可以在 documentation for CreateProcess on MSDN 按钮处看到它。
这不是 CreateProcess
独有的,几乎每个接受字符串的 Win32 API 函数都有一个 A
和一个 W
版本。
以下是您想要的:
dCreateProcess CreateProcess = Call("kernel32.dll", "CreateProcessW", typeof(dCreateProcess)) as dCreateProcess;
另见 What is the difference between CreateProcess and CreateProcessA?