0

kernel32.dll の CreateProcess 関数で遅延バインディングを使用しようとしていますが、他の関数とは異なり、null 値を返します。

遅延バインディングに使用しているコードは次のとおりです

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のいずれかです。CreateProcessACreateProcessW

于 2015-08-26T18:52:48.717 に答える
1

CreateProcesskernel32 で名前が付けられた関数はありません。CreateProcessA(ANSI) とCreateProcessW(Unicode)の 2 つのバージョンがあります。ボタンで、MSDN の CreateProcess のドキュメントを確認できます。

CreateProcessこれは、文字列を受け取るほぼすべての Win32 API 関数に固有のものではなくAWバージョンがあります。

以下はあなたが望むものです:

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

CreateProcess と CreateProcessA の違いは何ですか?も参照してください。

于 2015-08-26T18:53:37.360 に答える