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); } } }