0

我正在尝试对 kernel32.dll 中的 CreateProcess 函数使用后期绑定,但是,它返回一个空值,这与任何其他函数不同。

这是我用于后期绑定的代码

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;
4

2 回答 2

1

kernel32.dll实际上并没有导出具有名称的函数入口点CreateProcess- 它是unicode (Wide) 参数,CreateProcessA或者在你的情况下。CreateProcessW

于 2015-08-26T18:52:48.717 回答
1

kernel32中没有命名函数CreateProcess。它有两个版本CreateProcessA(ANSI)和CreateProcessW(Unicode)。您可以在按钮上看到MSDN 上 CreateProcess 的文档

CreateProcess这并不是几乎每个接受字符串的 Win32 API 函数都会有一个A和一个W版本所独有的。

以下是您想要的:

dCreateProcess CreateProcess = Call("kernel32.dll", "CreateProcessW", typeof(dCreateProcess)) as dCreateProcess;

另请参阅CreateProcess 和 CreateProcessA 有什么区别?

于 2015-08-26T18:53:37.360 回答