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


    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 或 uint(int 更常用一些)

    枚举类型

    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*),即对于变长字符串的处理,.net中StringBuilder可用作缓冲区

    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: est.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中“互操作封送处理”一节。

    人生,总是有一些空城旧事,年华未央;总是有些季节,一季花凉,满地忧伤。许多事,看开了,便会峰回路转;许多梦,看淡了,便会云开日出。学会思索,学会珍藏,微笑领悟,默默坚强。
  • 相关阅读:
    spring profile 多环境配置管理
    搭建docker私服仓库
    ubuntu安装mysql添加密码
    yum源安装docker
    keep + haproxy 运行原理
    gitlab汉化
    什么是DevOps?
    Kafka高并发原理概述
    k8s + flannel 内网不能互通问题排查
    Flannel跨主机互联概述及容器网络拓扑图
  • 原文地址:https://www.cnblogs.com/yuzhou133/p/4317539.html
Copyright © 2011-2022 走看看