C#的互操作性:缓冲区、结构、指针
2016-03-25 00:08
246 查看
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Runtime.InteropServices; namespace Interop { class Program { [DllImport("kernel32.dll", EntryPoint = "Beep")] public static extern bool MyBeep(uint iFreq, uint iDuration); //HMODULE WINAPI LoadLibrary( _In_ LPCTSTR lpFileName); [DllImport("kernel32.dll")] public static extern IntPtr LoadLibrary(string dllName); delegate int deleMessageBox(IntPtr hWnd, string text, string caption, uint type); //GetProcAddress函数检索指定的动态链接库(DLL)中的输出库函数地址。 //FARPROC GetProcAddress( // HMODULE hModule, // DLL模块句柄 // LPCSTR lpProcName // 函数名 // ); [DllImport("kernel32.dll")] public static extern IntPtr GetProcAddress(IntPtr hModule, string procName); //CharSet = CharSet.Auto [DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern int MessageBox(IntPtr hWnd, string text, string caption, uint type); //DWORD GetCurrentDirectory(DWORD nBufferLength, //sizeofdirectorybuffer //LPTSTR lpBuffer //directorybuffer //); [DllImport("kernel32.dll", CharSet = CharSet.Auto)] public static extern int GetCurrentDirectory(int BufferLength, System.Text.StringBuilder lpBuffer); //LPSTR GetCommandLine() [DllImport("kernel32.dll", CharSet = CharSet.Auto)] public static extern System.IntPtr GetCommandLine(); //结构体 //typedef struct{ // int wStructSize; // int x; // int y; // int dx; // int dy; // int wMax; // TCHAR rgchMember[2]; //}HELPWININFO; [StructLayout(LayoutKind.Sequential)] public struct HELPWININFO { int wStructSize; int x; int y; int dx; int dy; int wMax; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public char[] rgchMember; } static void Main(string[] args) { MyBeep(500, 500); //函数需要修改内存缓冲区,必须用StringBuilder,因为String类型是只读的 StringBuilder sb = new StringBuilder(255); GetCurrentDirectory(255, sb); Console.WriteLine(sb); //使用IntPtr类将返回的字符串保存到string中 IntPtr ptr = GetCommandLine(); string cmdline = Marshal.PtrToStringAuto(ptr); Console.WriteLine(cmdline); //GetProcAddress IntPtr ptrKernel32 = LoadLibrary("user32.dll"); IntPtr ptrProcMessageBox = GetProcAddress(ptrKernel32, "MessageBoxA"); deleMessageBox messageBox = Marshal.GetDelegateForFunctionPointer(ptrProcMessageBox, typeof(deleMessageBox)) as deleMessageBox; messageBox(IntPtr.Zero, @"public static extern IntPtr GetProcAddress(IntPtr hModule, string procName);", "LoadLibrary", 0x40); MessageBox(IntPtr.Zero, "Content Here!", "Caption", 0x40); } } }
相关文章推荐
- 【C#进阶系列】16 数组
- 【C#进阶系列】15 数组
- C#打印GroupBox控件区域
- c# socket 异步
- C#关于取DataTable中中间数据的方法
- C#——判断成绩是否通过
- C#——判断一个数是奇偶性
- C#扫盲之:静态成员、静态方法、静态类、实例成员及区别
- 详解C#中的反射
- C# 的时间戳转换
- C# String类
- C#-Math基本方法
- 多线程IP获取工具(C#)
- C# DateTime和TimeSpan
- C#中,使用正式表达式匹配获取所需数据
- 【转】C#获取当前日期时间(转)
- 基于C#实现网页爬虫
- c# listview columnHeader 双击自动适应宽度
- 程序进度条基础篇(WPF、C#、BackgroundWorker、代码说明)
- C# 协变out 、逆变 in