|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
我实在想不明白java的机制,为什么非要那么蛋疼,在同一个平台下重复编译。dotNETC#Programmer’sGuidetotheWin32API(Win32API声明C#版)
吝啬的神2001.09.07
噢,对不起我用了这个题目,现实上假如我能做到10%,我就很乐意了。由于我的桌上正放着一本DanAppleman的书,它曾陪伴我很多年,大概你也有一本:1215页,蓝色书皮,机器产业出书社。英文名叫:《DanAppleman’sVisualBasic5.0Programmer’sGuidetotheWin32API》。而我除借用这个相似的名字以外,只是做了一下收拾事情,不外这是一个不小的事情量(haha)
我把KERNEL32.DLL、USER32.DLL、GDI32.DLL、ADVAPI32.DLL、SHELL32.DLL、SPOOLSS.DLL、WINMM.DLL的函数和声明收拾了一下,改用C#的语法从头改写了一遍,收拾出一个C#版本。如许针对dotNET的PlatformInvocationServices(PInVoke),你就能够间接利用这些Win32的API函数了。今朝MS没有发布全部的Win32API有几能够在dotNET中利用,有几不可。有些功效在dotNET中没有对应的完成,那末今朝你大概还必要利用Win32的API函数。
布局和列举声明放在一同,Kernel32.dll、User32.Dll、GDI32.dll分离放在3个cs文件中;剩下的Advapi32.dll、Shell32.dll、Spoolss.dll、Winmm.dll四个DLL的函数放在一个cs文件中,全部的namespace起名叫Win32API.大抵的构架应当象上面如许:
namespaceWin32API{
usingSystem;
usingSystem.Runtime.InteropServices;
先是一切的布局和列举声明
classKernel32{….}
classUser32{….}
classGDI32{….}
classAdvapi32{….}
classShell32{….}
classSpoolss{….}
classWinmm{….}
}
对应的天生上面的C#文件:
Structs.NET.cs
Kernel32.NET.cs
User32.NET.cs
GDI32.NET.cs
OtherFnc.NET.cs
然后编译它们,如许就能够利用它们了,我没有盘算5个文件包含的一切的正确个数,不外应当有百个布局和列举,上千个函数声明吧。完成这些以后,如今最经常使用的MessageBox我能够如许利用了:
usingSystem;
usingWin32API;
publicclassTestWin32API
{
publicstaticvoidMain()
{
intiRet;
iRet=User32.MessageBox(0,"HelloC#Win32API","MyPinvoke",0);
}
}
就在测试这个例子时产生了一件风趣的事,由于刚入手下手我的cs文件都没有加NET的标识如许很天然的就有了Kernel32.cs、User32.cs等等,MessageBox是User32.DLL中的,而我编译的User32.cs默许天生的也叫User32.DLL,当我实行这个测试程序时终究产生毛病,我一向觉得本人的声明有成绩,然后我用FrameworkSDK中的例子也仍是堕落,直到我在别的的目次中运转一般时,我才发明本来本人的DLL名和体系的DLL名完整一样。然后就改成下面的那样,不外很奇异csc/t:exe/r:User32.dllTestWin32API.cs的编译指令竟然没有毛病提醒,真是可爱。提示你不要也象我一样。
噩梦大概还在前面,我还不晓得真实的cs声明中又有几个毛病,归正用到的时分再调试吧。由于太多了以是不成能全都测试,也不敢一个个的测试,只但愿本人这些收拾能起到举一反三的感化,假如今后你有新的版本,不要忘了Mail一份给我。
附带的Zip包中有一切cs的源码,我在FrameworkSDKBeta2下都编译经由过程。
Windows2000ADVServerSP2EN
VisualC#CompilerVersion7.00.9254
CLRversionv1.0.2914
你能够依据你的情形举行编译(要先编译Structs.NET.cs,由于别的的都要/r:Structs.NET.DLL)大概利用二进制的DLL。dotnet的编译手艺很好,5个DLL加起来才100多K。
上面是一下源码的节选:
--------------------------------------------------------------------------------
//WritebyccBoy
//Date:2001.09.07
//csc/t:library/r:System.dllStructs.NET.cs
//csc/t:library/r:Structs.NET.dllKernel32.NET.cs
//Emeditor3.14
namespaceWin32API{
usingSystem;
usingSystem.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential)]
publicclassABC{
publicintabcA;
publicintabcB;
publicintabcC;
}
[StructLayout(LayoutKind.Sequential)]
publicclassABCFLOAT{
publicfloatabcfA;
publicfloatabcfB;
publicfloatabcfC;
}
publicClassKerne
[img=1border=0style=,1src=]http://www.ckuyun.com/[/img]
无论谁倒了对双方阵营的粉丝们也是有害无益。 |
|