zoukankan      html  css  js  c++  java
  • C#调用dll(C++(Win32))时的类型转换总结


    C++(Win 32)

    C#

    char**

    作为输入参数转为char[]通过Encoding类对这个string[]进行编码后得到的一个char[]

    作为输出参数转为byte[]通过Encoding类对这个byte[]进行解码,得到字符串

    C++ Dll接口:

    void CplusplusToCsharp(in char** AgentID, out char** AgentIP);

    C#中的声明:

    [DllImport("Example.dll")]

    public static extern void CplusplusToCsharp(char[] AgentID, byte[] AgentIP);

    C#中的调用:

    Encoding encode = Encoding.Default;

    byte[] tAgentID;

    byte[] tAgentIP;

    string[] AgentIP;

    tAgentID = new byte[100];

    tAgentIP = new byte[100];

    CplusplusToCsharp(encode.GetChars(tAgentID), tAgentIP);

    AgentIP[i] = encode.GetString(tAgentIP,i*Length,Length);

    Handle

    IntPtr

    Hwnd

    IntPtr

    int*

    ref int

    int&

    ref int

    void*

    IntPtr

    unsigned char*

    ref byte

    BOOL

    bool

    DWORD

    int  uintint 更常用一些)

    枚举类型

    Win32

    BOOL MessageBeep(UINT uType // 声音类型); 其中的声音类型为枚举类型中的某一值。

    C#

    用户需要自己定义一个枚举类型:

    public enum BeepType

    {

      SimpleBeep = -1,

      IconAsterisk = 0x00000040,

      IconExclamation = 0x00000030,

      IconHand = 0x00000010,

      IconQuestion = 0x00000020,

      Ok = 0x00000000,

    }

    C#中导入该函数:

    [DllImport("user32.dll")]

    public static extern bool MessageBeep(BeepType beepType);

    C#中调用该函数:

    MessageBeep(BeepType.IconQuestion);

    结构类型

    Win32

    使用结构指针作为参数的函数:

    BOOL GetSystemPowerStatus(

     LPSYSTEM_POWER_STATUS lpSystemPowerStatus

    );

    Win32中该结构体的定义:

    typedef struct _SYSTEM_POWER_STATUS {

    BYTE  ACLineStatus;

    BYTE  BatteryFlag;

    BYTE  BatteryLifePercent;

    BYTE  Reserved1;

    DWORD BatteryLifeTime;

    DWORD BatteryFullLifeTime;

    } SYSTEM_POWER_STATUS, *LPSYSTEM_POWER_STATUS;

    C#

    用户自定义相应的结构体:

    struct SystemPowerStatus

    {

      byte ACLineStatus;

      byte batteryFlag;

      byte batteryLifePercent;

      byte reserved1;

      int batteryLifeTime;

      int batteryFullLifeTime;

    }

    C#中导入该函数:

    [DllImport("kernel32.dll")]

    public static extern bool GetSystemPowerStatus(

      ref SystemPowerStatus systemPowerStatus);

    C#中调用该函数:

    SystemPowerStatus sps;

    ….sps初始化赋值……

    GetSystemPowerStatus(ref sps);

    字符串

    对于字符串的处理分为以下几种情况:

    1、  字符串常量指针的处理(LPCTSTR),也适应于字符串常量的处理,.net中的string类型是不可变的类型。

    2、  字符串缓冲区的处理(char*),即对于变长字符串的处理,.netStringBuilder可用作缓冲区

    Win32

    BOOL GetFile(LPCTSTR lpRootPathName);

    C#

    函数声明:

    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]

    static extern bool GetFile (

     [MarshalAs(UnmanagedType.LPTStr)]

     string rootPathName);

    函数调用:

    string pathname;

    GetFile(pathname);

    备注:

    DllImport中的CharSet是为了说明自动地调用该函数相关的Ansi版本或者Unicode版本

     

    变长字符串处理:

    C#

    函数声明:

    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]

    public static extern int GetShortPathName(

      [MarshalAs(UnmanagedType.LPTStr)]

      string path,

      [MarshalAs(UnmanagedType.LPTStr)]

      StringBuilder shortPath,

      int shortPathLength);

    函数调用:

    StringBuilder shortPath = new StringBuilder(80);

    int result = GetShortPathName(

    @"d:\test.jpg", shortPath, shortPath.Capacity);

    string s = shortPath.ToString();

    struct

    具有内嵌字符数组的结构:

    Win32

    typedef struct _TIME_ZONE_INFORMATION {

      LONG    Bias;

      WCHAR   StandardName[ 32 ];

      SYSTEMTIME StandardDate;

      LONG    StandardBias;

      WCHAR   DaylightName[ 32 ];

      SYSTEMTIME DaylightDate;

      LONG    DaylightBias;

    } TIME_ZONE_INFORMATION, *PTIME_ZONE_INFORMATION;

    C#

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]

    struct TimeZoneInformation

    {

      public int bias;

      [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]

      public string standardName;

      SystemTime standardDate;

      public int standardBias;

      [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]

      public string daylightName;

      SystemTime daylightDate;

      public int daylightBias;

    }

    具有回调的函数

    Win32

    BOOL EnumDesktops(

     HWINSTA hwinsta,       // 窗口实例的句柄

     DESKTOPENUMPROC lpEnumFunc, // 回调函数

     LPARAM lParam        // 用于回调函数的值

    );

    回调函数DESKTOPENUMPROC的声明:

    BOOL CALLBACK EnumDesktopProc(

     LPTSTR lpszDesktop, // 桌面名称

     LPARAM lParam    // 用户定义的值

    );

    C#

    将回调函数的声明转化为委托:

    delegate bool EnumDesktopProc(

     [MarshalAs(UnmanagedType.LPTStr)]

      string desktopName,

      int lParam);

    该函数在C#中的声明:

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    static extern bool EnumDesktops(
      IntPtr windowStation,
      EnumDesktopProc callback,
      int lParam);

    该表对C#中调用win32函数,以及c++编写的dll时参数及返回值的转换做了一个小的总结,如果想进一步了解这方面内容的话,可以参照msdn中“互操作封送处理”一节。

    引自:http://blog.csdn.net/xiaochongchong1248/archive/2010/01/12/5181345.aspx

    例子:

    /// <summary>
    /// 定义结构体
    /// </summary>
    public struct UUID2
    {
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 37)]
        public string szID;
    }


    /// <summary>
    /// 声明非托管代码中的方法
    /// </summary>
    /// <param name="username">用户名</param>
    /// <param name="uId">用户编号</param>
    /// <returns>标志位 1-成功 0-没有此用户 -1-失败</returns>
    [DllImport("Camnpr.dll", EntryPoint = "GetUserID", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
    public static extern Int32 GetUserID(string username, ref UUID2 uId);

    /// <summary>
    /// 根据用户名获取用户编号
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void btnGetUserID_Click(object sender, EventArgs e)
    {
        string strPhoneNo = tbPhoneNO.Text.Trim();

        UUID2 uId = new UUID2();
        Int32 iReturn = GetUserID("camnpr", ref uId);

        if (iReturn > 0)
        {
            tbUserID.Text = uId.szID;
        }
        else
        {
            MessageBox.Show(iReturn.ToString());
        }
    }

  • 相关阅读:
    Jenkins和pipeline
    Docker摘要
    javascript文件加载模式与加载方法
    Pre-shared key
    持续集成CI相关的几个概念
    Fetch诞生记
    Content Security Policy介绍
    vivalidi 一款由Web技术诞生的Web浏览器
    Javascript async异步操作库简介
    Polymer初探
  • 原文地址:https://www.cnblogs.com/lidabo/p/2536737.html
Copyright © 2011-2022 走看看