• 在P/Invoke中使用GCHandle传送对象


    在C#中调用非托管函数的时,有很多函数需要使用在C#中定义对象的地址;因此要使用到GCHandle类。

    使用片断:

    DWORD ReadCert(
       UNT_DEV_HANDLE  hDev,
       BYTE*    pbCert,
       DWORD*    pdwCertLen,
       DWORD    dwFlag);

            /// Return Type: DWORD->unsigned int
            ///hDev: UNT_DEV_HANDLE->void*
            ///pbCert: BYTE*
            ///pdwCertLen: DWORD*
            ///dwFlag: DWORD->unsigned int
            [System.Runtime.InteropServices.DllImportAttribute("GAKeyPub", EntryPoint = "ReadCert")]
            public static extern int ReadCert(System.IntPtr hDev, [Out] IntPtr pbCert, ref int pdwCertLen, int dwFlag);

                byte[] certBytes = new byte[certLen];
                GCHandle hcertBytes = GCHandle.Alloc(certBytes, GCHandleType.Pinned);
                IntPtr pcert = hcertBytes.AddrOfPinnedObject();
                result = GAKeyPubInvoke.ReadCert(devHandle, pcert, ref certLen, 1);

    这样C#就可以取到数据了(并不是所有的非托管函数都适用)

  • 相关阅读:
    POJ 2299 UltraQuickSort
    POJ 3264 Balanced Lineup
    AcWing 265. 营业额统计
    POJ 3468 A Simple Problem with Integers
    P3372 【模板】线段树 1
    POJ 2155 Matrix
    HDU 2852 KiKi's KNumber
    POJ 3067 Japan
    【java/oracle】往blob字段里写入数据例子
    【Java/Oracle】将连续文件写入Blob字段
  • 原文地址:https://www.cnblogs.com/Yjianyong/p/1776752.html
Copyright © 2020-2023  润新知