日期:2013-04-22  浏览次数:20463 次

using System;
using System.Runtime.InteropServices;

namespace FastCSharp
{
class Class1
{


[STAThread]
unsafe static void Main(string[] args)
{
// comInvoke();
// helloWorld();
// StructInvoke();
// classInvode();
// PointerInvoke();
unsafeMethod();
}

// 调用一个com组件
// tlbimp工具
public static void comInvoke()
{
//string fileName = "c:\\windows\\clock.avi";
string fileName = @"C:\Documents and Settings\Administrator\桌面\WebApplication1\心中心密咒\dgmz.wma";
QuartzTypeLib.FilgraphManager graphManager = new QuartzTypeLib.FilgraphManagerClass();
QuartzTypeLib.IMediaControl mc = (QuartzTypeLib.IMediaControl)graphManager;
mc.RenderFile(fileName);
mc.Run();
Console.WriteLine("Hello World");
Console.ReadLine();
}
public static void helloWorld()
{
Win32Invoke.MessageBox(0,"Hello World","Platform Invoke Sample",0);
}
// 传递结构变量
public static void StructInvoke()
{
Point p = new Point();
p.x = 1;
p.y = 1;
Rect r = new Rect();
r.left = 0;
r.bottom = 2;
r.right = 2;
r.top = 0;
bool b = Win32Invoke.PtInRect(ref r,p);
System.Console.WriteLine("Point[1,1] is int Rect[0,0,2,2] ?" +b );
}
// 传递一个对象
public static void classInvode()
{
MySystemTime t = new MySystemTime();
Win32Invoke.GetSystemTime(t);
Console.WriteLine("System time is "
+ t.wYear + "/"
+ t.wMonth + "/"
+ t.wDay + " "
+ t.wHour + ":"
+ t.wMinute + ":"
+ t.wSecond
);

}
// 传送一个C#函数指针给Dll函数
public static void PointerInvoke()
{
CallBack myCallBack = new CallBack(Class1.Report);
Win32Invoke.EnumWindows(myCallBack,0);
}
public static bool Report(int hwnd, int lParam)
{
Console.WriteLine("Window handle is" + hwnd);
return true;
}
// 指针函数
unsafe static void SquareParam(int *p)
{
//unsafe mthod:takes pointer to int
*p *= *p;
}
// unsafe method : user address-of operator (&)
unsafe public static void unsafeMethod()
{
int i = 5;
SquareParam(&i);
Console.WriteLine("5 * 5 == " + i );
P pt = new P();
pt.x = 5;
pt.y = 6;
//fixed 关键字是告诉c#资源回收器接下来不要对某过变量的地址进行运算,不要对此变量的地址有任何改动
//pin pt in place
fixed(int* pointer =&pt.x)
{

SquareParam(pointer);
}
//pt now nupinned
Console.WriteLine("pt.x == {0} pt.y == {1}",pt.x,pt.y);
}
}
public class Win32Invoke
{
[DllImport("user32.dll",CharSet = CharSet.Auto)]
public static extern int MessageBox(int hWnd,String text,String caption,uint type);
[DllImport("user32.dll")]
public static extern bool PtInRect(ref Rect r, Point p);
[DllImport("Kernel32.dll")]
public static extern void GetSystemTime(MySystemTime st);
[DllImport("user32.dll")]
public static extern int EnumWindows(CallBack x, int y);
}

public struct Point
{
public int x;
public int y;
}
public class P
{
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;
}
[StructLayout(LayoutKind.Sequential)]
public class MySystemTime
{
public ushort wYear;
public ushort wMonth;
public ushort wDayOfWeek;
public