特定の場合にヌルポインターを必要とするP/Invoke SignatureでSafeHandleをどのように使用できますか?

StackOverflow https://stackoverflow.com/questions/8370016

  •  27-10-2019
  •  | 
  •  

質問

うまくいけば、これはあまりにもあいまいではありませんが、次のp/invoke signatureを考慮してください。

[DllImport("odbc32.dll", CharSet = CharSet.Unicode)]
internal static extern OdbcResult SQLAllocHandle(
    OdbcHandleType HandleType,
    IntPtr InputHandle,
    ref IntPtr OutputHandlePtr);

次のように、SafeHandlesを使用するためにこの署名を再設計したいと思います。

[DllImport("odbc32.dll", CharSet = CharSet.Unicode)]
internal static extern OdbcResult SQLAllocHandle(
    OdbcHandleType HandleType,
    MySafeHandle InputHandle,
    ref MySafeHandle OutputHandlePtr);

でも、 MSDNによると, 、Handletype引数がsql_handle_envであり、それ以外の場合は非ヌルポインターである場合、不利益の引数はヌルポインターでなければなりません。

これらのセマンティクスを単一のP/Invoke Signatureでキャプチャするにはどうすればよいですか?回答にコールサイトの例を含めてください。私の現在の解決策は、2つの署名を使用することです。

役に立ちましたか?

解決

SafeHandle クラスなので、合格できるはずです null 実際のものではなく SafeHandle. 。 null参照は、p/invokeのヌルポインターとしてマーシャリングされます。

SafeHandle handle = new SafeHandle();
OdbcResult result= SQLAllocHandle(OdbcHandleType.SQL_HANDLE_ENV, null, ref handle);

他のヒント

SHF301による答え パス null 入力引数の場合 InputHandle. 。これはほとんどのAPIでは機能しません(おそらく、回答を受け入れたことを考えると、OPの特定の問題に対して何らかの形で行われます)。

私はこのパターンを使用します:

[SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)]
public class RegionHandle : SafeHandleZeroOrMinusOneIsInvalid
{
    private RegionHandle() : base(true) {}

    public static readonly RegionHandle Null = new RegionHandle();

    [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
    override protected bool ReleaseHandle()
    {
        return Region.DeleteObject(handle);
    }
}

これは、ヌルハンドルを渡すためにこれを行うことができることを意味します。

SomeApi(RegionHandle.Null);

それはどのようにあるかに似ています IntPtr.Zero 静的メンバー。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top