欢迎来到天天文库
浏览记录
ID:33540452
大小:121.00 KB
页数:24页
时间:2019-02-27
《c#调用api函数详细说明》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、C#:[DllImport("kernel32.dll")]是什么意思??这叫引入kernel32.dll这个动态连接库。这个动态连接库里面包含了很多WindowsAPI函数,如果你想使用这面的函数,就需要这么引入。举个例子:[DllImport("kernel32.dll")]privatestaticexternvoid函数名(参数,[参数]);函数名就是一个属于kernel32.dll里的一个函数。完了你就可以用那个函数了。kernel32.dll调用kernel32.dll这个DLL里面的API接口!系统API例如[DllImport("user32.dll")]//-
2、-引入APIpublicstaticexternReturnTypeFunctionName(typearg1,typearg2,...);//--声明方法调用该方法是和调用普通方法没区别DLLImport属性现在是更深入地进行探讨的时候了。在对托管代码进行P/Invoke调用时,DllImportAttribute类型扮演着重要的角色。DllImportAttribute的主要作用是给CLR指示哪个DLL导出您想要调用的函数。相关DLL的名称被作为一个构造函数参数传递给DllImportAttribute。如果您无法肯定哪个DLL定义了您要使用的WindowsAPI函数,Pl
3、atformSDK文档将为您提供最好的帮助资源。在WindowsAPI函数主题文字临近结尾的位置,SDK文档指定了C应用程序要使用该函数必须链接的.lib文件。在几乎所有的情况下,该.lib文件具有与定义该函数的系统DLL文件相同的名称。例如,如果该函数需要C应用程序链接到Kernel32.lib,则该函数就定义在Kernel32.dll中。您可以在MessageBeep中找到有关MessageBeep的PlatformSDK文档主题。在该主题结尾处,您会注意到它指出库文件是User32.lib;这表明MessageBeep是从User32.dll中导出的。可选的DllImpo
4、rtAttribute属性除了指出宿主DLL外,DllImportAttribute还包含了一些可选属性,其中四个特别有趣:EntryPoint、CharSet、SetLastError和CallingConvention。EntryPoint在不希望外部托管方法具有与DLL导出相同的名称的情况下,可以设置该属性来指示导出的DLL函数的入口点名称。当您定义两个调用相同非托管函数的外部方法时,这特别有用。另外,在Windows中还可以通过它们的序号值绑定到导出的DLL函数。如果您需要这样做,则诸如“#1”或“#129”的EntryPoint值指示DLL中非托管函数的序号值而不是函
5、数名。CharSet对于字符集,并非所有版本的Windows都是同样创建的。Windows9x系列产品缺少重要的Unicode支持,而WindowsNT和WindowsCE系列则一开始就使用Unicode。在这些操作系统上运行的CLR将Unicode用于String和Char数据的内部表示。但也不必担心—当调用Windows9xAPI函数时,CLR会自动进行必要的转换,将其从Unicode转换为ANSI。如果DLL函数不以任何方式处理文本,则可以忽略DllImportAttribute的CharSet属性。然而,当Char或String数据是等式的一部分时,应该将CharSet
6、属性设置为CharSet.Auto。这样可以使CLR根据宿主OS使用适当的字符集。如果没有显式地设置CharSet属性,则其默认值为CharSet.Ansi。这个默认值是有缺点的,因为对于在Windows2000、WindowsXP和WindowsNT®上进行的interop调用,它会消极地影响文本参数封送处理的性能。应该显式地选择CharSet.Ansi或CharSet.Unicode的CharSet值而不是使用CharSet.Auto的唯一情况是:您显式地指定了一个导出函数,而该函数特定于这两种Win32OS中的某一种。ReadDirectoryChangesWAPI函数就
7、是这样的一个例子,它只存在于基于WindowsNT的操作系统中,并且只支持Unicode;在这种情况下,您应该显式地使用CharSet.Unicode。有时,WindowsAPI是否有字符集关系并不明显。一种决不会有错的确认方法是在PlatformSDK中检查该函数的C语言头文件。(如果您无法肯定要看哪个头文件,则可以查看PlatformSDK文档中列出的每个API函数的头文件。)如果您发现该API函数确实定义为一个映射到以A或W结尾的函数名的宏,则字符集与您尝试调用的函数有关系。Windo
此文档下载收益归作者所有