调用dll中的函数

C#有未有法子能够从来都用已经存在的效益(举例Windows中的一些功力,C++中一度编写制定好的1对主意),而不必要再行编辑代码?

DllImport attribute的总结,dllimportattribute

C#有未有点子能够一贯都用曾经存在的成效(举个例子Windows中的一些功效,C++中早就编写制定好的一些情势),而不需求再行编辑代码?

答案是必定,正是经过接下去要说的 DllImport 。

     DllImport的namespace: using System.Runtime.InteropServices;

    MSDN中对DllImportAttribute的解说:可将该属性应用于艺术。

    DllImportAttribute 属性提供对从非托管 DLL
导出的函数实行调用所须要的新闻。必须提供含有入口点的 DLL 的称谓。

    DllImport 属性定义如下: 

*    *

namespace System.Runtime.InteropServices 
   { 
    [AttributeUsage(AttributeTargets.Method)] 
    public class DllImportAttribute: System.Attribute 
    { 
     public DllImportAttribute(string dllName) {...} 
     public CallingConvention CallingConvention; 
     public CharSet CharSet; 
     public string EntryPoint; 
     public bool ExactSpelling; 
     public bool PreserveSig; 
     public bool SetLastError; 
     public string Value { get {...} } 
    } 
   }    

*   * 说明:    
    1、DllImport只好放置在章程声明上。   
    二、DllImport具备单个定位参数:钦命包蕴被导入方法的 dll 名称的
dllName 参数。   
    三、DllImport具备三个命名参数:    
     a、CallingConvention 参数:提示入口点的调用约定。若是未钦点CallingConvention,则接纳暗许值 CallingConvention.Winapi。    
     b、CharSet 参数: 提示用在入口点中的字符集。假若未指定CharSet,则运用私下认可值 CharSet.Auto。   
     c、EntryPoint 参数: 给出 dll 中入口点的称谓。如若未钦赐EntryPoint,则应用方法自身的名目。    
     d、ExactSpelling 参数: 提示 EntryPoint
是不是必须与提醒的入口点的拼写完全协作。假诺未钦命ExactSpelling,则选择暗中同意值 false。    
     e、PreserveSig 参数:
提示方法的具名应当被保留如故被转移。当具名被更改时,它被更改为一个独具
HRESULT 重临值和该再次来到值的一个名叫 retval
的叠加输出参数的具名。要是未钦点 PreserveSig,则应用暗中认可值 true。    
     f、SetLastError 参数: 提示方法是不是保留
Win3二”上一不当”。借使未钦点 SetLastError,则使用默许值 false。    
    四、它是1回性属性类。    
    伍、用 DllImport 属性修饰的方法必须具有 extern 修饰符。

  •     DllImport的用法:
    *

    DllImport(“MyDllImport.dll”)]

    private static extern int mySum(int a,int b);
    

*
*一 在C#程序设计中使用Win32类库  常用对应类型:
一、DWOGL450D 是 四 字节的平头,由此大家得以行使 int 或 uint 作为 C#
对应类型。
2、bool 类型与 BOOL 对应。

示例一:调用 Beep() API 来发出声音
    Beep() 是在 kernel3二.lib 中定义的,在MSDN
中的定义,Beep具有以下原型:

BOOL Beep(DWORD dwFreq, // 声音频率 
            DWORD dwDuration // 声音持续时间); 

用 C# 编写以下原型:

[DllImport("kernel32.dll")] 
public static extern bool Beep(int frequency, int duration);

*
*示例二:枚举类型和常量
  
  MessageBeep() 是在 user32.lib 中定义的,在MSDN
中的定义,MessageBeep具备以下原型:

 BOOL MessageBeep(UINT uType // 声音类型
                                           ); 

用C#编排一下原型:

public enum BeepType
{
  SimpleBeep = -1,
  IconAsterisk = 0x00000040,
  IconExclamation = 0x00000030,
  IconHand = 0x00000010,
  IconQuestion = 0x00000020,
  Ok = 0x00000000,
} 

uType 参数实际上接受一组预先定义的常量,对于 uType 参数,使用 enum
类型是合乎情理的。

[DllImport("user32.dll")]
public static extern bool MessageBeep(BeepType beepType);  

*
*示例三:管理组织
    要是必要规定笔记本的电池意况。Win3二 为此提供了电源管理函数,寻觅MSDN 能够找到GetSystemPowerStatus() 函数。 
  

  BOOL GetSystemPowerStatus( 
                              LPSYSTEM_POWER_STATUS lpSystemPowerStatus 
                             );

   
此函数包括指向有些组织的指针,大家从没对此展开过管理。要管理组织,大家须要用
C# 定义结构。大家从非托管的定义开首: 

typedef struct _SYSTEM_POWER_STATUS { 
   BYTE  ACLineStatus; 
   BYTE  BatteryFlag; 
   BYTE  BatteryLifePercent; 
   BYTE  Reserved1; 
   DWORD BatteryLifeTime; 
   DWORD BatteryFullLifeTime; 
} SYSTEM_POWER_STATUS, *LPSYSTEM_POWER_STATUS; 

   然后,通过用 C# 类型代替 C 类型来收获 C# 版本。 

struct SystemPowerStatus 
{ 
  byte ACLineStatus; 
  byte batteryFlag; 
  byte batteryLifePercent; 
  byte reserved1; 
  int batteryLifeTime; 
  int batteryFullLifeTime; 
} 

    那样,就足以1本万利地编写出 C# 原型: 

[DllImport("kernel32.dll")] 
public static extern bool GetSystemPowerStatus( ref SystemPowerStatus systemPowerStatus); 

   在此原型中,大家用 “ref”
指明将传递结构指针而不是结构值。那是拍卖通过指针传递的组织的貌似方法。 
   此函数运营优秀,但是最棒将 ACLineStatus 和 batteryFlag 字段定义为
enum: 

    enum ACLineStatus: byte 
   { 
    Offline = 0, 
    Online = 1, 
    Unknown = 255, 
   } 
   enum BatteryFlag: byte 
   { 
    High = 1, 
    Low = 2, 
    Critical = 4, 
    Charging = 8, 
    NoSystemBattery = 128, 
    Unknown = 255, 
   } 

请留心,由于协会的字段是部分字节,因而大家使用 byte 作为该 enum
的主导项目

示例四:管理字符串

*二 C# 中调用C++代码
    int 类型 

[DllImport(“MyDLL.dll")] 
//返回个int 类型 
public static extern int mySum (int a1,int b1); 
//DLL中申明 
extern “C” __declspec(dllexport)  int WINAPI mySum(int a2,int b2) 
{ 
//a2 b2不能改变a1 b1
//a2=..
//b2=...
 return a+b; 
} 
//参数传递int 类型 
public static extern int mySum (ref int a1,ref int b1); 
//DLL中申明 
extern “C” __declspec(dllexport)  int WINAPI mySum(int *a2,int *b2) 
{ 
//可以改变 a1, b1
*a2=...
*b2=...
 return a+b; 
} 

DLL 需传入char *类型 

[DllImport(“MyDLL.dll")] 
//传入值 
public static extern int mySum (string  astr1,string bstr1); 
//DLL中申明 
extern “C” __declspec(dllexport)  int WINAPI mySum(char * astr2,char * bstr2) 
{ 
//改变astr2 bstr 2  ,astr1 bstr1不会被改变
 return a+b; 
}

DLL 需传出char *类型 

[DllImport(“MyDLL.dll")] 
// 传出值
public static extern int mySum (StringBuilder abuf, StringBuilder bbuf ); 
//DLL中申明 
extern “C” __declspec(dllexport)  int WINAPI mySum(char * astr,char * bstr) 
{ 
//传出char * 改变astr bstr -->abuf, bbuf可以被改变
 return a+b; 
} 

DLL 回调函数 

BOOL EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam) 

using System; 
using System.Runtime.InteropServices; 
public delegate bool CallBack(int hwnd, int lParam); //定义委托函数类型 
public class EnumReportApp 
{ 
   [DllImport("user32")] 
   public static extern int EnumWindows(CallBack x, int y); 
   public static void Main()
   { 
       CallBack myCallBack = new CallBack(EnumReportApp.Report);              
       EnumWindows(myCallBack, 0); 
   } 
   public static bool Report(int hwnd, int lParam) 
   { 
        Console.Write("Window handle is "); 
        Console.WriteLine(hwnd); return true; 
     } 
} 

DLL  传递结构  

BOOL PtInRect(const RECT *lprc, POINT pt); 

using System.Runtime.InteropServices; 
[StructLayout(LayoutKind.Sequential)] 
public struct Point {
  public int x; 
  public int y;
 } 

[StructLayout(LayoutKind.Explicit)] 
 public struct Rect 
 { 
   [FieldOffset(0)] public int left; 
   [FieldOffset(4)] public int top;
   [FieldOffset(8)] public int right; 
   [FieldOffset(12)] public int bottom;
 } 

 Class XXXX { 
 [DllImport("User32.dll")] 
 public static extern bool PtInRect(ref  Rect r, Point p); 
 }

 

attribute的总结,dllimportattribute
C#有没有办法能够一向都用1度存在的成效(例如Windows中的一些效益,C++中早已编写制定好的有个别格局)…

C#调用dll中的函数

小说分类:操作系统

文章来源:http://blog.csdn.net/strmagic/archive/2007/11/02/1863462.aspx

世家在实际上中国人民解放军海军事工业程高校业作学习C#的时候,可能会问:为何大家要为一些已经存在的机能(比如Windows中的一些职能,C++中曾经编写制定好的部分主意)要再度编排代码,C#有未有办法能够直接都用这一个本来已经存在的作用吗?答案是迟早的,大家能够透过C#中的DllImport直接调用那几个效应。
    DllImport所在的名字空间 using System.Runtime.InteropServices;
   
MSDN中对DllImportAttribute的分解是那般的:可将该属性应用于方法。DllImportAttribute
属性提供对从非托管 DLL 导出的函数进行调用所必备的音讯。作为最低须求,必须提供带有入口点的 DLL
的称号。
    DllImport 属性定义如下: 
    namespace System.Runtime.InteropServices 
   { 
    [AttributeUsage(AttributeTargets.Method)] 
    public class DllImportAttribute: System.Attribute 
    { 
     public DllImportAttribute(string dllName) {…} 
     public CallingConvention CallingConvention; 
     public CharSet CharSet; 
     public string EntryPoint; 
     public bool ExactSpelling; 
     public bool PreserveSig; 
     public bool SetLastError; 
     public string Value { get {…} } 
    } 
  }    
    说明:    
    1、DllImport只好放置在章程声明上。   
    贰、DllImport具有单个定位参数:内定包涵被导入方法的 dll 名称的
dllName 参数。   
    三、DllImport具有七个命名参数:    
     a、CallingConvention 参数提示入口点的调用约定。假诺未钦点CallingConvention,则运用暗中认可值 CallingConvention.Winapi。    
     b、CharSet 参数提示用在入口点中的字符集。若是未钦赐CharSet,则利用暗中认可值 CharSet.Auto。   
     c、EntryPoint 参数给出 dll 中入口点的名号。要是未钦命EntryPoint,则选拔方法本人的称呼。    
     d、ExactSpelling 参数提醒 EntryPoint
是还是不是必须与提示的入口点的拼写完全匹配。即使未钦赐ExactSpelling,则运用私下认可值 false。    
     e、PreserveSig
参数指示方法的具名应当被保留仍然被撤换。当签字被撤换时,它被转移为二个持有
HRESULT 再次来到值和该重回值的2个名叫 retval
的叠加输出参数的签署。假诺未钦命 PreserveSig,则选取暗中认可值 true。    
     f、SetLastError 参数提示方法是还是不是保留 Win3二”上一荒谬”。如若未钦赐SetLastError,则运用私下认可值 false。    
    肆、它是一回性属性类。    
    5、其它,用 DllImport 属性修饰的秘技必须怀有 extern 修饰符。

    DllImport的用法:
       DllImport(“MyDllImport.dll”)]
       private static extern int mySum(int a,int b);

一 在C#次第设计中选拔Win3二类库  常用对应类型:
调用dll中的函数。一、DWORubiconD 是 四 字节的平头,由此我们能够运用 int 或 uint 作为 C#
对应类型。
2、bool 类型与 BOOL 对应。

以身作则1:调用 Beep() API 来发出声音
    Beep() 是在 kernel32.lib 中定义的,在MSDN
中的定义,Beep具备以下原型:
    BOOL Beep(DWO奥迪Q5D dwFreq, // 声音频率 
                           DWO安德拉D dwDuration // 声音持续时间); 
用 C# 编写以下原型:
[DllImport(“kernel32.dll”)] 
public static extern bool Beep(int frequency, int duration);

示范二:枚举类型和常量
    MessageBeep() 是在 user32.lib 中定义的,在MSDN
中的定义,MessageBeep具有以下原型:
    BOOL MessageBeep(UINT uType // 声音类型
                                           ); 

用C#编排一下原型:
public enum BeepType
{
  SimpleBeep = -1,
  IconAsterisk = 0x00000040,
  IconExclamation = 0x00000030,
  IconHand = 0x00000010,
  IconQuestion = 0x00000020,
  Ok = 0x00000000,

uType 参数实际上接受一组预先定义的常量,对于 uType 参数,使用 enum
类型是合乎情理的。
[DllImport(“user32.dll”)]
public static extern bool MessageBeep(BeepType beepType);  

以身作则三:管理协会
    有时笔者急需明确本人台式机的电池情况。Win32 为此提供了电源处理函数,搜索MSDN 能够找到GetSystemPowerStatus() 函数。 
    BOOL GetSystemPowerStatus( 
                                                         
LPSYSTEM_POWER_STATUS lpSystemPowerStatus 
                                                            );
   
此函数包蕴指向有些组织的指针,我们尚无对此实行过管理。要管理组织,大家须要用
C# 定义结构。我们从非托管的定义起首: 
typedef struct _SYSTEM_POWER_STATUS { 
BYTE  ACLineStatus; 
BYTE  BatteryFlag; 
BYTE  BatteryLifePercent; 
BYTE  Reserved1; 
DWORD BatteryLifeTime; 
DWORD BatteryFullLifeTime; 
} SYSTEM_澳门葡京备用网址,POWER_STATUS, *LPSYSTEM_POWER_STATUS; 
   然后,通过用 C# 类型代替 C 类型来赢得 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); 
  
在此原型中,大家用“ref”指明将传递结构指针而不是结构值。那是管理通过指针传递的结构的相似方法。 
   此函数运转非凡,可是最棒将 ACLineStatus 和 batteryFlag 字段定义为
enum: 
  enum ACLineStatus: byte 
   { 
    Offline = 0, 
    Online = 1, 
    Unknown = 255, 
   } 
   enum BatteryFlag: byte 
   { 
    High = 1, 
    Low = 2, 
    Critical = 4, 
    Charging = 8, 
    NoSystemBattery = 128, 
    Unknown = 255, 
   } 
请留意,由于协会的字段是局地字节,由此我们运用 byte 作为该 enum
的中坚项目

示范肆:处理字符串

二 C# 中调用C++代码
    int 类型 
[DllImport(“MyDLL.dll”)] 
//返回个int 类型 
public static extern int mySum (int a1,int b1); 
//DLL中申明 
extern “C” __declspec(dllexport)  int WINAPI mySum(int a2,int b2) 

//a贰 b2不可能更换a壹 b1
//a2=..
//b2=…
 return a+b; 
}

 

//参数字传送递int 类型 
public static extern int mySum (ref int a1,ref int b1); 
//DLL中申明 
extern “C” __declspec(dllexport)  int WINAPI mySum(int *a2,int
*b2) 

//能够退换 a一, b一
*a2=…
*b2=…
 return a+b; 

DLL 需传入char *类型 
[DllImport(“MyDLL.dll”)] 
//传入值 
public static extern int mySum (string  astr1,string bstr1); 
//DLL中申明 
extern “C” __declspec(dllexport)  int WINAPI mySum(char * astr2,char
* bstr2) 

//退换astr二 bstr 贰  ,astr一 bstr一不会被改动
 return a+b; 
}

DLL 需传出char *类型 
[DllImport(“MyDLL.dll”)] 
// 传出值
public static extern int mySum (StringBuilder abuf, StringBuilder bbuf
); 
//DLL中申明 
extern “C” __declspec(dllexport)  int WINAPI mySum(char * astr,char
* bstr) 

//传出char * 改造astr bstr –>abuf, bbuf能够被改换
 return a+b; 

 
DLL 回调函数 

BOOL EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam) 

澳门葡京备用网址 1

using System; 
using System.Runtime.InteropServices; 
public delegate bool CallBack(int hwnd, int lParam);
//定义委托函数类型 
public class EnumReportApp 

[DllImport(“user32”)] 
public static extern int EnumWindows(CallBack x, int y); 
public static void Main() { 
CallBack myCallBack = new CallBack(EnumReportApp.Report);
EnumWindows(myCallBack, 0); 

public static bool Report(int hwnd, int lParam) 

Console.Write(“Window handle is “); 
Console.WriteLine(hwnd); return true; 

}

DLL  传递结构  
BOOL PtInRect(const RECT *lprc, POINT pt); 

using System.Runtime.InteropServices; 
[StructLayout(LayoutKind.Sequential)] 
public struct Point {
 public int x; 
public int y;
 } 
[StructLayout(LayoutKind.Explicit)] 
 public struct Rect 
 { 
[FieldOffset(0)] public int left; 
[FieldOffset(4)] public int top;
[FieldOffset(8)] public int right; 
[FieldOffset(12)] public int bottom;
 } 
Class XXXX { 
 [DllImport(“User32.dll”)] 
public static extern bool PtInRect(ref  Rect r, Point p); 
 }

 

答案是放任自流,正是经过接下去要说的 DllImport

     DllImport的namespace: using System.Runtime.InteropServices;

    MSDN中对DllImportAttribute的表达:可将该属性应用于方法。

    DllImportAttribute 属性提供对从非托管 DLL
导出的函数进行调用所不可缺少的新闻。必须提供含有入口点的 DLL 的称谓。

    DllImport 属性定义如下: 

*    *

namespace System.Runtime.InteropServices 
   { 
    [AttributeUsage(AttributeTargets.Method)] 
    public class DllImportAttribute: System.Attribute 
    { 
     public DllImportAttribute(string dllName) {...} 
     public CallingConvention CallingConvention; 
     public CharSet CharSet; 
     public string EntryPoint; 
     public bool ExactSpelling; 
     public bool PreserveSig; 
     public bool SetLastError; 
     public string Value { get {...} } 
    } 
   }    

*   * 说明:    
    一、DllImport只好放置在艺术注脚上。   
    2、DllImport具有单个定位参数:内定包含被导入方法的 dll 名称的
dllName 参数。   
    三、DllImport具有四个命名参数:    
     a、CallingConvention 参数:提醒入口点的调用约定。假设未钦赐CallingConvention,则利用暗许值 CallingConvention.Winapi。    
     b、CharSet 参数: 提醒用在入口点中的字符集。要是未钦定CharSet,则使用默许值 CharSet.Auto。   
     c、EntryPoint 参数: 给出 dll 中入口点的称谓。假如未钦点EntryPoint,则运用方式本人的名称。    
     d、ExactSpelling 参数: 提醒 EntryPoint
是还是不是必须与提示的入口点的拼写完全相配。假如未钦定ExactSpelling,则采纳暗中认可值 false。    
     e、PreserveSig 参数:
提示方法的签署应当被封存照旧被转移。当签字被转移时,它被更动为四个具有HRESULT 再次回到值和该重临值的3个名字为 retval
的叠加输出参数的具名。倘若未钦赐 PreserveSig,则动用暗许值 true。    
     f、SetLastError 参数: 提醒方法是或不是保留
Win3二”上壹不当”。倘诺未钦命 SetLastError,则运用暗中同意值 false。    
    四、它是2次性属性类。    
    伍、用 DllImport 属性修饰的主意必须具有 extern 修饰符。

  •     DllImport的用法:
    *

    DllImport(“MyDllImport.dll”)]

    private static extern int mySum(int a,int b);
    

*
*一 在C#程序设计中使用Win3贰类库  常用对应类型:
一、DWO智跑D 是 四 字节的平头,由此大家得以行使 int 或 uint 作为 C#
对应类型。
2、bool 类型与 BOOL 对应。

示例一:调用 Beep() API 来发出声音
    Beep() 是在 kernel3贰.lib 中定义的,在MSDN
中的定义,Beep具备以下原型:

BOOL Beep(DWORD dwFreq, // 声音频率 
            DWORD dwDuration // 声音持续时间); 

用 C# 编写以下原型:

[DllImport("kernel32.dll")] 
public static extern bool Beep(int frequency, int duration);

*
*示例二:枚举类型和常量
  
  MessageBeep() 是在 user3贰.lib 中定义的,在MSDN
中的定义,MessageBeep具备以下原型:

 BOOL MessageBeep(UINT uType // 声音类型
                                           ); 

用C#编排一下原型:

public enum BeepType
{
  SimpleBeep = -1,
  IconAsterisk = 0x00000040,
  IconExclamation = 0x00000030,
  IconHand = 0x00000010,
  IconQuestion = 0x00000020,
  Ok = 0x00000000,
} 

uType 参数实际上接受壹组预先定义的常量,对于 uType 参数,使用 enum
类型是合乎情理的。

[DllImport("user32.dll")]
public static extern bool MessageBeep(BeepType beepType);  

*
*示例三:管理组织
    如若急需规定台式机的电池情状。Win3二 为此提供了电源管理函数,搜索MSDN 能够找到GetSystemPowerStatus() 函数。 
  

  BOOL GetSystemPowerStatus( 
                              LPSYSTEM_POWER_STATUS lpSystemPowerStatus 
                             );

   
此函数包涵指向某些协会的指针,大家从不对此进行过处理。要管理协会,大家要求用
C# 定义结构。大家从非托管的定义初始: 

typedef struct _SYSTEM_POWER_STATUS { 
   BYTE  ACLineStatus; 
   BYTE  BatteryFlag; 
   BYTE  BatteryLifePercent; 
   BYTE  Reserved1; 
   DWORD BatteryLifeTime; 
   DWORD BatteryFullLifeTime; 
} SYSTEM_POWER_STATUS, *LPSYSTEM_POWER_STATUS; 

   然后,通过用 C# 类型取代 C 类型来获得 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); 

   在此原型中,大家用 “ref”
指明将传递结构指针而不是结构值。这是管理通过指针传递的结构的相似方法。 
   此函数运转优异,可是最佳将 ACLineStatus 和 batteryFlag 字段定义为
enum: 

    enum ACLineStatus: byte 
   { 
    Offline = 0, 
    Online = 1, 
    Unknown = 255, 
   } 
   enum BatteryFlag: byte 
   { 
    High = 1, 
    Low = 2, 
    Critical = 4, 
    Charging = 8, 
    NoSystemBattery = 128, 
    Unknown = 255, 
   } 

请留意,由于组织的字段是一对字节,由此我们运用 byte 作为该 enum
的骨干项目

示例四:处理字符串

*二 C# 中调用C++代码
    int 类型 

[DllImport(“MyDLL.dll")] 
//返回个int 类型 
public static extern int mySum (int a1,int b1); 
//DLL中申明 
extern “C” __declspec(dllexport)  int WINAPI mySum(int a2,int b2) 
{ 
//a2 b2不能改变a1 b1
//a2=..
//b2=...
 return a+b; 
} 
//参数传递int 类型 
public static extern int mySum (ref int a1,ref int b1); 
//DLL中申明 
extern “C” __declspec(dllexport)  int WINAPI mySum(int *a2,int *b2) 
{ 
//可以改变 a1, b1
*a2=...
*b2=...
 return a+b; 
} 

DLL 需传入char *类型 

[DllImport(“MyDLL.dll")] 
//传入值 
public static extern int mySum (string  astr1,string bstr1); 
//DLL中申明 
extern “C” __declspec(dllexport)  int WINAPI mySum(char * astr2,char * bstr2) 
{ 
//改变astr2 bstr 2  ,astr1 bstr1不会被改变
 return a+b; 
}

DLL 需传出char *类型 

[DllImport(“MyDLL.dll")] 
// 传出值
public static extern int mySum (StringBuilder abuf, StringBuilder bbuf ); 
//DLL中申明 
extern “C” __declspec(dllexport)  int WINAPI mySum(char * astr,char * bstr) 
{ 
//传出char * 改变astr bstr -->abuf, bbuf可以被改变
 return a+b; 
} 

DLL 回调函数 

BOOL EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam) 

using System; 
using System.Runtime.InteropServices; 
public delegate bool CallBack(int hwnd, int lParam); //定义委托函数类型 
public class EnumReportApp 
{ 
   [DllImport("user32")] 
   public static extern int EnumWindows(CallBack x, int y); 
   public static void Main()
   { 
       CallBack myCallBack = new CallBack(EnumReportApp.Report);              
       EnumWindows(myCallBack, 0); 
   } 
   public static bool Report(int hwnd, int lParam) 
   { 
        Console.Write("Window handle is "); 
        Console.WriteLine(hwnd); return true; 
     } 
} 

DLL  传递结构  

BOOL PtInRect(const RECT *lprc, POINT pt); 

using System.Runtime.InteropServices; 
[StructLayout(LayoutKind.Sequential)] 
public struct Point {
  public int x; 
  public int y;
 } 

[StructLayout(LayoutKind.Explicit)] 
 public struct Rect 
 { 
   [FieldOffset(0)] public int left; 
   [FieldOffset(4)] public int top;
   [FieldOffset(8)] public int right; 
   [FieldOffset(12)] public int bottom;
 } 

 Class XXXX { 
 [DllImport("User32.dll")] 
 public static extern bool PtInRect(ref  Rect r, Point p); 
 }

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website