CSharp.API.大全

CSharp.API.大全
CSharp.API.大全

C# API

C:\ProgramFiles\MicrosoftVisual Studio .NET\ FrameworkSDK\Samples\ Technologies\

Interop\PlatformInvoke\ WinAPIs\CS目录下有大量的调用API的例子。

一、调用格式

using System.Runtime.InteropServices; //引用此名称空间,简化后面的代码

//使用DllImportAttribute特性来引入api函数,注意声明的是空方法,即方法体为空。[DllImport("user32.dll")]

public static extern ReturnType FunctionName(type arg1,type arg2,...);

//调用时与调用其他方法并无区别

可以使用字段进一步说明特性,用逗号隔开,如:

[ DllImport( "kernel32", EntryPoint="GetVersionEx" )]

DllImportAttribute特性的公共字段如下:

1、CallingConvention 指示向非托管实现传递方法参数时所用的CallingConvention 值。CallingConvention.Cdecl : 调用方清理堆栈。它使您能够调用具有varargs 的函数。CallingConvention.StdCall : 被调用方清理堆栈。它是从托管代码调用非托管函数的默认约定。

2、CharSet 控制调用函数的名称版本及指示如何向方法封送String 参数。

此字段被设置为CharSet 值之一。如果CharSet 字段设置为Unicode,则所有字符串参数在传递到非托管实现之前都转换成Unicode 字符。这还导致向DLL EntryPoint 的名称中追加字母“W”。如果此字段设置为Ansi,则字符串将转换成ANSI 字符串,同时向DLL EntryPoint 的名称中追加字母“A”。大多数Win32 API 使用这种追加“W”或“A”的约定。如果CharSet 设置为Auto,则这种转换就是与平台有关的(在Windows NT 上为Unicode,在Windows 98 上为Ansi)。CharSet 的默认值为Ansi。CharSet 字段也用于确定将从指定的DLL 导入哪个版本的函数。CharSet.Ansi 和CharSet.Unicode 的名称匹配规则大不相同。对于Ansi 来说,如果将EntryPoint 设置为“MyMethod”且它存在的话,则返回“MyMethod”。如果DLL 中没有“MyMethod”,但存在“MyMethodA”,则返回“MyMethodA”。对于Unicode 来说则正好相反。如果将EntryPoint 设置为“MyMethod”且它存在的话,则返回“MyMethodW”。如果DLL 中不存在“MyMethodW”,但存在“MyMethod”,则返回“MyMethod”。如果使用的是Auto,则匹配规则与平台有关(在Windows NT 上为Unicode,在Windows 98 上为Ansi)。如果ExactSpelling 设置为true,则只有当DLL 中存在“MyMethod”时才返回“MyMethod”。

3、EntryPoint 指示要调用的DLL 入口点的名称或序号。

如果你的方法名不想与api函数同名的话,一定要指定此参数,例如:

[DllImport("user32.dll",CharSet="CharSet.Auto",EntryPoint="MessageBox")]

public static extern int MsgBox(IntPtr hWnd,string txt,string caption, int type);

4、ExactSpelling 指示是否应修改非托管DLL 中的入口点的名称,以与CharSet 字段中指定的CharSet 值相对应。如果为true,则当DllImportAttribute.CharSet 字段设置为CharSet 的Ansi 值时,向方法名称中追加字母A,当DllImportAttribute.CharSet 字段设置为CharSet 的Unicode 值时,向方法的名称中追加字母W。此字段的默认值是false。

5、PreserveSig 指示托管方法签名不应转换成返回HRESULT、并且可能有一个对应于返回值的附加[out, retval] 参数的非托管签名。

6、SetLastError 指示被调用方在从属性化方法返回之前将调用Win32 API SetLastError。true 指示调用方将调用SetLastError,默认为false。运行时封送拆收器将调用GetLastError 并缓存返回的值,以防其被其他API 调用重写。用户可通过调用GetLastWin32Error 来检索错误代码。

二、参数类型:

1、数值型直接用对应的就可。(DWORD -> int , WORD -> Int16)

2、API中字符串指针类型-> .net中string

3、API中句柄(dWord) -> .net中IntPtr

4、API中结构-> .net中结构或者类。注意这种情况下,要先用StructLayout特性限定声明结构或类

公共语言运行库利用StructLayoutAttribute控制类或结构的数据字段在托管内存中的物理布局,即类或结构需要按某种方式排列。如果要将类传递给需要指定布局的非托管代码,则显式控制类布局是重要的。它的构造函数中用LayoutKind值初始化StructLayoutAttribute 类的新实例。LayoutKind.Sequential 用于强制将成员按其出现的顺序进行顺序布局。

LayoutKind.Explicit 用于控制每个数据成员的精确位置。利用Explicit,每个成员必须使用FieldOffsetAttribute 指示此字段在类型中的位置。如:

[StructLayout(LayoutKind.Explicit, Size=16, CharSet=CharSet.Ansi)]

public class MySystemTime

{

[FieldOffset(0)]public ushort wYear;

[FieldOffset(2)]public ushort wMonth;

[FieldOffset(4)]public ushort wDayOfWeek;

[FieldOffset(6)]public ushort wDay;

[FieldOffset(8)]public ushort wHour;

[FieldOffset(10)]public ushort wMinute;

[FieldOffset(12)]public ushort wSecond;

[FieldOffset(14)]public ushort wMilliseconds;

}

下面是针对API中OSVERSIONINFO结构,在.net中定义对应类或结构的例子:

/**********************************************

* API中定义原结构声明

* OSVERSIONINFOA STRUCT

* dwOSVersionInfoSize DWORD ?

* dwMajorVersion DWORD ?

* dwMinorVersion DWORD ?

* dwBuildNumber DWORD ?

* dwPlatformId DWORD ?

* szCSDVersion BYTE 128 dup (?)

* OSVERSIONINFOA ENDS

*

* OSVERSIONINFO equ

*********************************************/

//.net中声明为类

[ StructLayout( LayoutKind.Sequential )]

public class OSVersionInfo

{

public int OSVersionInfoSize;

public int majorVersion;

public int minorVersion;

public int buildNumber;

public int platformId;

[ MarshalAs( UnmanagedType.ByValTStr, SizeConst=128 )]

public String versionString;

}

//或者

//.net中声明为结构

[ StructLayout( LayoutKind.Sequential )]

public struct OSVersionInfo2

{

public int OSVersionInfoSize;

public int majorVersion;

public int minorVersion;

public int buildNumber;

public int platformId;

[ MarshalAs( UnmanagedType.ByValTStr, SizeConst=128 )]

public String versionString;

}

此例中用到MashalAs特性,它用于描述字段、方法或参数的封送处理格式。用它作为参数前缀并指定目标需要的数据类型。例如,以下代码将两个参数作为数据类型长指针封送给Windows API 函数的字符串(LPStr):

[MarshalAs(UnmanagedType.LPStr)]

String existingfile;

[MarshalAs(UnmanagedType.LPStr)]

String newfile;

注意结构作为参数时候,一般前面要加上ref修饰符,否则会出现错误:对象的引用没有指定对象的实例。

[ DllImport( "kernel32", EntryPoint="GetVersionEx" )]

public static extern bool GetVersionEx2( ref OSVersionInfo2 osvi );

三、如何保证使用托管对象的平台调用成功?

如果在调用平台invoke 后的任何位置都未引用托管对象,则垃圾回收器可能将完成该托管对象。这将释放资源并使句柄无效,从而导致平台invoke 调用失败。用HandleRef 包装句柄可保证在平台invoke 调用完成前,不对托管对象进行垃圾回收。

例如下面:

FileStream fs = new FileStream( "a.txt", FileMode.Open );

StringBuilder buffer = new StringBuilder( 5 );

int read = 0;

ReadFile(fs.Handle, buffer, 5, out read, 0 ); //调用Win API中的ReadFile函数

由于fs是托管对象,所以有可能在平台调用还未完成时候被垃圾回收站回收。将文件流的句柄用HandleRef包装后,就能避免被垃圾站回收:

[ DllImport( "Kernel32.dll" )]

public static extern bool ReadFile(

HandleRef hndRef,

StringBuilder buffer,

int numberOfBytesToRead,

out int numberOfBytesRead,

ref Overlapped flag );

......

......

FileStream fs = new FileStream( "HandleRef.txt", FileMode.Open );

HandleRef hr = new HandleRef( fs, fs.Handle );

StringBuilder buffer = new StringBuilder( 5 );

int read = 0;

// platform invoke will hold reference to HandleRef until call ends

ReadFile( hr, buffer, 5, out read, 0 );

我在自己最近的编程中注意到一个趋势,正是这个趋势才引出本月的专栏主题。最近,我在基于Microsoft? .NET Framework 的应用程序中完成了大量的Win32? Interop。我并不是要说我的应用程序充满了自定义的interop 代码,但有时我会在.NET Framework 类库中碰到一些次要但又繁絮、不充分的内容,通过调用该Windows? API,可以快速减少这样的麻烦。

因此我认为,.NET Framework 1.0 或 1.1 版类库中存在任何Windows 所没有的功能限制都不足为怪。毕竟,32 位的Windows(不管何种版本)是一个成熟的操作系统,为广大客户服务了十多年。相比之下,.NET Framework 却是一个新事物。

随着越来越多的开发人员将生产应用程序转到托管代码,开发人员更频繁地研究底层操作系统以图找出一些关键功能显得很自然—至少目前是如此。

值得庆幸的是,公共语言运行库(CLR) 的interop 功能(称为平台调用(P/Invoke))非常完善。在本专栏中,我将重点介绍如何实际使用P/Invoke 来调用Windows API 函数。当指CLR 的COM Interop 功能时,P/Invoke 当作名词使用;当指该功能的使用时,则将其当作动词使用。我

并不打算直接介绍COM Interop,因为它比P/Invoke 具有更好的可访问性,却更加复杂,这有点自相矛盾,这使得将COM Interop 作为专栏主题来讨论不太简明扼要。

走进P/Invoke

首先从考察一个简单的P/Invoke 示例开始。让我们看一看如何调用Win32 MessageBeep 函数,它的非托管声明如以下代码所示:

BOOL MessageBeep(

UINT uType // beep type

);

为了调用MessageBeep,您需要在C# 中将以下代码添加到一个类或结构定义中:

[DllImport("User32.dll")]

static extern Boolean MessageBeep(UInt32 beepType);

令人惊讶的是,只需要这段代码就可以使托管代码调用非托管的MessageBeep API。它不是一个方法调用,而是一个外部方法定义。(另外,它接近于一个来自 C 而C# 允许的直接端口,因此以它为起点来介绍一些概念是有帮助的。)来自托管代码的可能调用如下所示:

MessageBeep(0);

请注意,现在MessageBeep 方法被声明为static。这是P/Invoke 方法所要求的,因为在该Windows API 中没有一致的实例概念。接下来,还要注意该方法被标记为extern。这是提示编译器该方法是通过一个从DLL 导出的函数实现的,因此不需要提供方法体。

说到缺少方法体,您是否注意到MessageBeep 声明并没有包含一个方法体?与大多数算法由中间语言(IL) 指令组成的托管方法不同,P/Invoke 方法只是元数据,实时(JIT) 编译器在运行时通过它将托管代码与非托管的DLL 函数连接起来。执行这种到非托管世界的连接所需的一个重要信息就是导出非托管方法的DLL 的名称。这一信息是由MessageBeep 方法声明之前的DllImport 自定义属性提供的。在本例中,可以看到,MessageBeep 非托管API 是由Windows 中的User32.dll 导出的。

到现在为止,关于调用MessageBeep 就剩两个话题没有介绍,请回顾一下,调用的代码与以下所示代码片段非常相似:

[DllImport("User32.dll")]

static extern Boolean MessageBeep(UInt32 beepType);

最后这两个话题是与数据封送处理(data marshaling) 和从托管代码到非托管函数的实际方法调用有关的话题。调用非托管MessageBeep 函数可以由找到作用域内的extern MessageBeep 声明的任何托管代码执行。该调用类似于任何其他对静态方法的调用。它与其他任何托管方法调用的共同之处在于带来了数据封送处理的需要。

C# 的规则之一是它的调用语法只能访问CLR 数据类型,例如System.UInt32 和

System.Boolean。C# 显然不识别Windows API 中使用的基于C 的数据类型(例如UINT 和BOOL),这些类型只是C 语言类型的类型定义而已。所以当Windows API 函数MessageBeep 按以下方式编写时

BOOL MessageBeep( UINT uType )

外部方法就必须使用CLR 类型来定义,如您在前面的代码片段中所看到的。需要使用与基础API 函数类型不同但与之兼容的CLR 类型是P/Invoke 较难使用的一个方面。因此,在本专栏的后面我将用完整的章节来介绍数据封送处理。

样式

在C# 中对Windows API 进行P/Invoke 调用是很简单的。但如果类库拒绝使您的应用程序发出嘟声,应该想方设法调用Windows 使它进行这项工作,是吗?

是的。但是与选择的方法有关,而且关系甚大!通常,如果类库提供某种途径来实现您的意图,则最好使用API 而不要直接调用非托管代码,因为CLR 类型和Win32 之间在样式上有很大的不同。我可以将关于这个问题的建议归结为一句话。当您进行P/Invoke 时,不要使应用程序逻辑直接属于任何外部方法或其中的构件。如果您遵循这个小规则,从长远看经常会省去许多的麻烦。

图 1 中的代码显示了我所讨论的MessageBeep 外部方法的最少附加代码。图 1 中并没有任何显著的变化,而只是对无包装的外部方法进行一些普通的改进,这可以使工作更加轻松一些。从顶部开始,您会注意到一个名为Sound 的完整类型,它专用于MessageBeep。如果我需要使用Windows API 函数PlaySound 来添加对播放波形的支持,则可以重用Sound 类型。然而,我不会因公开单个公共静态方法的类型而生气。毕竟这只是应用程序代码而已。还应该注意到,Sound 是密封的,并定义了一个空的私有构造函数。这些只是一些细节,目的是使用户不会错误地从Sound 派生类或者创建它的实例。

图 1 中的代码的下一个特征是,P/Invoke 出现位置的实际外部方法是Sound 的私有方法。这个方法只是由公共MessageBeep 方法间接公开,后者接受BeepTypes 类型的参数。这个间接的额外层是一个很关键的细节,它提供了以下好处。首先,应该在类库中引入一个未来的beep 托管方法,可以重复地通过公共MessageBeep 方法来使用托管API,而不必更改应用程序中的其余代码。

该包装方法的第二个好处是:当您进行P/Invoke 调用时,您放弃了免受访问冲突和其他低级破坏的权利,这通常是由CLR 提供的。缓冲方法可以保护您的应用程序的其余部分免受访问冲突及类似问题的影响(即使它不做任何事而只是传递参数)。该缓冲方法将由P/Invoke 调用引入的任何潜在的错误本地化。

将私有外部方法隐藏在公共包装后面的第三同时也是最后的一个好处是,提供了向该方法添加一些最小的CLR 样式的机会。例如,在图 1 中,我将Windows API 函数返回的Boolean 失败

转换成更像CLR 的异常。我还定义了一个名为BeepTypes 的枚举类型,它的成员对应于同该Windows API 一起使用的定义值。由于C# 不支持定义,因此可以使用托管枚举类型来避免幻数向整个应用程序代码扩散。

包装方法的最后一个好处对于简单的Windows API 函数(如MessageBeep)诚然是微不足道的。但是当您开始调用更复杂的非托管函数时,您会发现,手动将Windows API 样式转换成对CLR 更加友好的方法所带来的好处会越来越多。越是打算在整个应用程序中重用interop 功能,越是应该认真地考虑包装的设计。同时我认为,在非面向对象的静态包装方法中使用对CLR 友好的参数也并非不可以。

DLL Import 属性

现在是更深入地进行探讨的时候了。在对托管代码进行P/Invoke 调用时,DllImportAttribute 类型扮演着重要的角色。DllImportAttribute 的主要作用是给CLR 指示哪个DLL 导出您想要调用的函数。相关DLL 的名称被作为一个构造函数参数传递给DllImportAttribute。

如果您无法肯定哪个DLL 定义了您要使用的Windows API 函数,Platform SDK 文档将为您提供最好的帮助资源。在Windows API 函数主题文字临近结尾的位置,SDK 文档指定了 C 应用程序要使用该函数必须链接的.lib 文件。在几乎所有的情况下,该.lib 文件具有与定义该函数的系统DLL 文件相同的名称。例如,如果该函数需要 C 应用程序链接到Kernel32.lib,则该函数就定义在Kernel32.dll 中。您可以在MessageBeep 中找到有关MessageBeep 的Platform SDK 文档主题。在该主题结尾处,您会注意到它指出库文件是User32.lib;这表明MessageBeep 是从User32.dll 中导出的。

可选的DllImportAttribute 属性

除了指出宿主DLL 外,DllImportAttribute 还包含了一些可选属性,其中四个特别有趣:EntryPoint、CharSet、SetLastError 和CallingConvention。

EntryPoint 在不希望外部托管方法具有与DLL 导出相同的名称的情况下,可以设置该属性来指示导出的DLL 函数的入口点名称。当您定义两个调用相同非托管函数的外部方法时,这特别有用。另外,在Windows 中还可以通过它们的序号值绑定到导出的DLL 函数。如果您需要这样做,则诸如“#1”或“#129”的EntryPoint 值指示DLL 中非托管函数的序号值而不是函数名。

CharSet 对于字符集,并非所有版本的Windows 都是同样创建的。Windows 9x 系列产品缺少重要的Unicode 支持,而Windows NT 和Windows CE 系列则一开始就使用Unicode。在这些操作系统上运行的CLR 将Unicode 用于String 和Char 数据的内部表示。但也不必担心—当调用Windows 9x API 函数时,CLR 会自动进行必要的转换,将其从Unicode转换为ANSI。

如果DLL 函数不以任何方式处理文本,则可以忽略DllImportAttribute 的CharSet 属性。然而,当Char 或String 数据是等式的一部分时,应该将CharSet 属性设置为CharSet.Auto。这样可以使CLR 根据宿主OS 使用适当的字符集。如果没有显式地设置CharSet 属性,则其默认值为CharSet.Ansi。这个默认值是有缺点的,因为对于在Windows 2000、Windows XP 和Windows NT? 上进行的interop 调用,它会消极地影响文本参数封送处理的性能。

应该显式地选择CharSet.Ansi 或CharSet.Unicode 的CharSet 值而不是使用CharSet.Auto 的唯一情况是:您显式地指定了一个导出函数,而该函数特定于这两种Win32 OS 中的某一种。ReadDirectoryChangesW API 函数就是这样的一个例子,它只存在于基于Windows NT 的操作系统中,并且只支持Unicode;在这种情况下,您应该显式地使用CharSet.Unicode。

有时,Windows API 是否有字符集关系并不明显。一种决不会有错的确认方法是在Platform SDK 中检查该函数的 C 语言头文件。(如果您无法肯定要看哪个头文件,则可以查看Platform SDK 文档中列出的每个API 函数的头文件。)如果您发现该API 函数确实定义为一个映射到以 A 或W 结尾的函数名的宏,则字符集与您尝试调用的函数有关系。Windows API 函数的一个例子是在WinUser.h 中声明的GetMessage API,您也许会惊讶地发现它有 A 和W 两种版本。

SetLastError 错误处理非常重要,但在编程时经常被遗忘。当您进行P/Invoke 调用时,也会面临其他的挑战—处理托管代码中Windows API 错误处理和异常之间的区别。我可以给您一点建议。

如果您正在使用P/Invoke 调用Windows API 函数,而对于该函数,您使用GetLastError 来查找扩展的错误信息,则应该在外部方法的DllImportAttribute 中将SetLastError 属性设置为true。这适用于大多数外部方法。

这会导致CLR 在每次调用外部方法之后缓存由API 函数设置的错误。然后,在包装方法中,可以通过调用类库的System.Runtime.InteropServices.Marshal 类型中定义的

Marshal.GetLastWin32Error 方法来获取缓存的错误值。我的建议是检查这些期望来自API 函数的错误值,并为这些值引发一个可感知的异常。对于其他所有失败情况(包括根本就没意料到的失败情况),则引发在https://www.360docs.net/doc/be15478645.html,ponentModel 命名空间中定义的Win32Exception,并将Marshal.GetLastWin32Error 返回的值传递给它。如果您回头看一下图1 中的代码,您会看到我在extern MessageBeep 方法的公共包装中就采用了这种方法。

CallingConvention 我将在此介绍的最后也可能是最不重要的一个DllImportAttribute 属性是CallingConvention。通过此属性,可以给CLR 指示应该将哪种函数调用约定用于堆栈中的参数。CallingConvention.Winapi 的默认值是最好的选择,它在大多数情况下都可行。然而,如果该调用不起作用,则可以检查Platform SDK 中的声明头文件,看看您调用的API 函数是否是一个不符合调用约定标准的异常API。

通常,本机函数(例如Windows API 函数或C- 运行时DLL 函数)的调用约定描述了如何将参数推入线程堆栈或从线程堆栈中清除。大多数Windows API 函数都是首先将函数的最后一个参数推入堆栈,然后由被调用的函数负责清理该堆栈。相反,许多C-运行时DLL 函数都被定义为按照方法参数在方法签名中出现的顺序将其推入堆栈,将堆栈清理工作交给调用者。

幸运的是,要让P/Invoke 调用工作只需要让外围设备理解调用约定即可。通常,从默认值CallingConvention.Winapi 开始是最好的选择。然后,在C 运行时DLL 函数和少数函数中,可能需要将约定更改为CallingConvention.Cdecl。

数据封送处理

数据封送处理是P/Invoke 具有挑战性的方面。当在托管和非托管代码之间传递数据时,CLR 遵循许多规则,很少有开发人员会经常遇到它们直至可将这些规则记住。除非您是一名类库开发人员,否则在通常情况下没有必要掌握其细节。为了最有效地在CLR 上使用P/Invoke,即使只偶尔需要interop 的应用程序开发人员仍然应该理解数据封送处理的一些基础知识。

在本月专栏的剩余部分中,我将讨论简单数字和字符串数据的数据封送处理。我将从最基本的数字数据封送处理开始,然后介绍简单的指针封送处理和字符串封送处理。

封送数字和逻辑标量

Windows OS 大部分是用C 编写的。因此,Windows API 所用到的数据类型要么是C 类型,要么是通过类型定义或宏定义重新标记的 C 类型。让我们看看没有指针的数据封送处理。简单起见,首先重点讨论的是数字和布尔值。

当通过值向Windows API 函数传递参数时,需要知道以下问题的答案:

? 数据从根本上讲是整型的还是浮点型的?

? 如果数据是整型的,则它是有符号的还是无符号的?

? 如果数据是整型的,则它的位数是多少?

? 如果数据是浮点型的,则它是单精度的还是双精度的?

有时答案很明显,但有时却不明显。Windows API 以各种方式重新定义了基本的 C 数据类型。图 2 列出了 C 和Win32 的一些公共数据类型及其规范,以及一个具有匹配规范的公共语言运行库类型。

通常,只要您选择一个其规范与该参数的Win32 类型相匹配的CLR 类型,您的代码就能够正常工作。不过也有一些特例。例如,在Windows API 中定义的BOOL 类型是一个有符号的32 位整型。然而,BOOL 用于指示Boolean 值true 或false。虽然您不用将BOOL 参数作为System.Int32 值封送,但是如果使用System.Boolean 类型,就会获得更合适的映射。字符类型的映射类似于BOOL,因为有一个特定的CLR 类型(System.Char) 指出字符的含义。

在了解这些信息之后,逐步介绍示例可能是有帮助的。依然采用beep 主题作为例子,让我们来试一下Kernel32.dll 低级Beep,它会通过计算机的扬声器发生嘟声。这个方法的Platform SDK 文档可以在Beep 中找到。本机API 按以下方式进行记录:

BOOL Beep(

DWORD dwFreq, // Frequency

DWORD dwDuration // Duration in milliseconds

);

在参数封送处理方面,您的工作是了解什么CLR 数据类型与Beep API 函数所使用的DWORD 和BOOL 数据类型相兼容。回顾一下图2 中的图表,您将看到DWORD 是一个32 位的无符号整数值,如同CLR 类型System.UInt32。这意味着您可以使用UInt32 值作为送往Beep 的两个参数。BOOL 返回值是一个非常有趣的情况,因为该图表告诉我们,在Win32 中,BOOL 是一个32 位的有符号整数。因此,您可以使用System.Int32 值作为来自Beep 的返回值。然而,CLR 也定义了System.Boolean 类型作为Boolean 值的语义,所以应该使用它来替代。CLR 默认将System.Boolean 值封送为32 位的有符号整数。此处所显示的外部方法定义是用于Beep 的结果P/Invoke 方法:

[DllImport("Kernel32.dll", SetLastError=true)]

static extern Boolean Beep(

UInt32 frequency, UInt32 duration);

指针参数

许多Windows API 函数将指针作为它们的一个或多个参数。指针增加了封送数据的复杂性,因为它们增加了一个间接层。如果没有指针,您可以通过值在线程堆栈中传递数据。有了指针,则可以通过引用传递数据,方法是将该数据的内存地址推入线程堆栈中。然后,函数通过内存地址间接访问数据。使用托管代码表示此附加间接层的方式有多种。

在C# 中,如果将方法参数定义为ref 或out,则数据通过引用而不是通过值传递。即使您没有使用Interop 也是这样,但只是从一个托管方法调用到另一个托管方法。例如,如果通过ref 传递System.Int32 参数,则在线程堆栈中传递的是该数据的地址,而不是整数值本身。下面是一个定义为通过引用接收整数值的方法的示例:

void FlipInt32(ref Int32 num){

num = -num;

}

这里,FlipInt32 方法获取一个Int32 值的地址、访问数据、对它求反,然后将求反过的值赋给原始变量。在以下代码中,FlipInt32 方法会将调用程序的变量x 的值从10 更改为-10:

Int32 x = 10;

FlipInt32(ref x);

在托管代码中可以重用这种能力,将指针传递给非托管代码。例如,FileEncryptionStatus API 函数以32 位无符号位掩码的形式返回文件加密状态。该API 按以下所示方式进行记录:

BOOL FileEncryptionStatus(

LPCTSTR lpFileName, // file name

LPDWORD lpStatus // encryption status

);

请注意,该函数并不使用它的返回值返回状态,而是返回一个Boolean 值,指示调用是否成功。在成功的情况下,实际的状态值是通过第二个参数返回的。它的工作方式是调用程序向该函数传递指向一个DWORD 变量的指针,而该API 函数用状态值填充指向的内存位置。以下代码片段显示了一个调用非托管FileEncryptionStatus 函数的可能外部方法定义:

[DllImport("Advapi32.dll", CharSet=CharSet.Auto)]

static extern Boolean FileEncryptionStatus(String filename,

out UInt32 status);

该定义使用out 关键字来为UInt32 状态值指示by-ref 参数。这里我也可以选择ref 关键字,实际上在运行时会产生相同的机器码。out 关键字只是一个by-ref 参数的规范,它向C# 编译器指示所传递的数据只在被调用的函数外部传递。相反,如果使用ref 关键字,则编译器会假定数据可以在被调用的函数的内部和外部传递。

托管代码中out 和ref 参数的另一个很好的方面是,地址作为by-ref 参数传递的变量可以是线程堆栈中的一个本地变量、一个类或结构的元素,也可以是具有合适数据类型的数组中的一个元素引用。调用程序的这种灵活性使得by-ref 参数成为封送缓冲区指针以及单数值指针的一个很好的起点。只有在我发现ref 或out 参数不符合我的需要的情况下,我才会考虑将指针封送为更复杂的CLR 类型(例如类或数组对象)。

如果您不熟悉 C 语法或者调用Windows API 函数,有时很难知道一个方法参数是否需要指针。一个常见的指示符是看参数类型是否是以字母P 或LP 开头的,例如LPDWORD 或PINT。在这两个例子中,LP 和P 指示参数是一个指针,而它们指向的数据类型分别为DWORD 或INT。然而,在有些情况下,可以直接使用C 语言语法中的星号(*) 将API 函数定义为指针。以下代码片段展示了这方面的示例:

void TakesAPointer(DWORD* pNum);

可以看到,上述函数的唯一一个参数是指向DWORD 变量的指针。

当通过P/Invoke 封送指针时,ref 和out 只用于托管代码中的值类型。当一个参数的CLR 类型使用struct 关键字定义时,可以认为该参数是一个值类型。Out 和ref 用于封送指向这些数据类型的指针,因为通常值类型变量是对象或数据,而在托管代码中并没有对值类型的引用。相反,当封送引用类型对象时,并不需要ref 和out 关键字,因为变量已经是对象的引用了。

如果您对引用类型和值类型之间的差别不是很熟悉,请查阅2000 年12 月发行的MSDN? Magazine,在.NET 专栏的主题中可以找到更多信息。大多数CLR 类型都是引用类型;然而,除了System.String 和System.Object,所有的基元类型(例如System.Int32 和System.Boolean)都是值类型。

封送不透明(Opaque) 指针:一种特殊情况

有时在Windows API 中,方法传递或返回的指针是不透明的,这意味着该指针值从技术角度讲是一个指针,但代码却不直接使用它。相反,代码将该指针返回给Windows 以便随后进行重用。

一个非常常见的例子就是句柄的概念。在Windows 中,内部数据结构(从文件到屏幕上的按钮)在应用程序代码中都表示为句柄。句柄其实就是不透明的指针或有着指针宽度的数值,应用程序用它来表示内部的OS 构造。

少数情况下,API 函数也将不透明指针定义为PVOID 或LPVOID 类型。在Windows API 的定义中,这些类型意思就是说该指针没有类型。

当一个不透明指针返回给您的应用程序(或者您的应用程序期望得到一个不透明指针)时,您应该将参数或返回值封送为CLR 中的一种特殊类型— System.IntPtr。当您使用IntPtr 类型时,通常不使用out 或ref 参数,因为IntPtr 意为直接持有指针。不过,如果您将一个指针封送为一个指针,则对IntPtr 使用by-ref 参数是合适的。

在CLR 类型系统中,System.IntPtr 类型有一个特殊的属性。不像系统中的其他基类型,IntPtr 并没有固定的大小。相反,它在运行时的大小是依底层操作系统的正常指针大小而定的。这意味着在32 位的Windows 中,IntPtr 变量的宽度是32 位的,而在64 位的Windows 中,实时编译器编译的代码会将IntPtr 值看作64 位的值。当在托管代码和非托管代码之间封送不透明指针时,这种自动调节大小的特点十分有用。

请记住,任何返回或接受句柄的API 函数其实操作的就是不透明指针。您的代码应该将Windows 中的句柄封送成System.IntPtr 值。

您可以在托管代码中将IntPtr 值强制转换为32 位或64 位的整数值,或将后者强制转换为前者。然而,当使用Windows API 函数时,因为指针应是不透明的,所以除了存储和传递给外部方法外,不能将它们另做它用。这种“只限存储和传递”规则的两个特例是当您需要向外部方法传递null 指针值和需要比较IntPtr 值与null 值的情况。为了做到这一点,您不能将零强制转换为System.IntPtr,而应该在IntPtr 类型上使用Int32.Zero 静态公共字段,以便获得用于比较或赋值的null 值。

封送文本

在编程时经常要对文本数据进行处理。文本为interop 制造了一些麻烦,这有两个原因。首先,底层操作系统可能使用Unicode 来表示字符串,也可能使用ANSI。在极少数情况下,例如MultiByteToWideChar API 函数的两个参数在字符集上是不一致的。

第二个原因是,当需要进行P/Invoke 时,要处理文本还需要特别了解到 C 和CLR 处理文本的方式是不同的。在 C 中,字符串实际上只是一个字符值数组,通常以null 作为结束符。大多数Windows API 函数是按照以下条件处理字符串的:对于ANSI,将其作为字符值数组;对于Unicode,将其作为宽字符值数组。

幸运的是,CLR 被设计得相当灵活,当封送文本时问题得以轻松解决,而不用在意Windows API 函数期望从您的应用程序得到的是什么。这里是一些需要记住的主要考虑事项:

? 是您的应用程序向API 函数传递文本数据,还是API 函数向您的应用程序返回字符串数

据?或者二者兼有?

? 您的外部方法应该使用什么托管类型?

? API 函数期望得到的是什么格式的非托管字符串?

我们首先解答最后一个问题。大多数Windows API 函数都带有LPTSTR 或LPCTSTR 值。(从函数角度看)它们分别是可修改和不可修改的缓冲区,包含以null 结束的字符数组。“C”代表常数,意味着使用该参数信息不会传递到函数外部。LPTSTR 中的“T”表明该参数可以是Unicode 或ANSI,取决于您选择的字符集和底层操作系统的字符集。因为在Windows API 中大多数字符串参数都是这两种类型之一,所以只要在DllImportAttribute 中选择CharSet.Auto,CLR 就按默认的方式工作。

然而,有些API 函数或自定义的DLL 函数采用不同的方式表示字符串。如果您要用到一个这样的函数,就可以采用MarshalAsAttribute 修饰外部方法的字符串参数,并指明一种不同于默认LPTSTR 的字符串格式。有关MarshalAsAttribute 的更多信息,请参阅位于MarshalAsAttribute Class 的Platform SDK 文档主题。

现在让我们看一下字符串信息在您的代码和非托管函数之间传递的方向。有两种方式可以知道处理字符串时信息的传递方向。第一个也是最可靠的一个方法就是首先理解参数的用途。例如,您正调用一个参数,它的名称类似CreateMutex 并带有一个字符串,则可以想像该字符串信息是从应用程序向API 函数传递的。同时,如果您调用GetUserName,则该函数的名称表明字符串信息是从该函数向您的应用程序传递的。

除了这种比较合理的方法外,第二种查找信息传递方向的方式就是查找API 参数类型中的字母“C”。例如,GetUserName API 函数的第一个参数被定义为LPTSTR 类型,它代表一个指向Unicode 或ANSI 字符串缓冲区的长指针。但是CreateMutex 的名称参数被类型化为LTCTSTR。请注意,这里的类型定义是一样的,但增加一个字母“C”来表明缓冲区为常数,API 函数不能写入。

一旦明确了文本参数是只用作输入还是用作输入/输出,就可以确定使用哪种CLR 类型作为参数类型。这里有一些规则。如果字符串参数只用作输入,则使用System.String 类型。在托管代码中,字符串是不变的,适合用于不会被本机API 函数更改的缓冲区。

如果字符串参数可以用作输入和/或输出,则使用System.StringBuilder 类型。StringBuilder 类型是一个很有用的类库类型,它可以帮助您有效地构建字符串,也正好可以将缓冲区传递给本机函数,由本机函数为您填充字符串数据。一旦函数调用返回,您只需要调用StringBuilder 对象的ToString 就可以得到一个String 对象。

GetShortPathName API 函数能很好地用于显示什么时候使用String、什么时候使用StringBuilder,因为它只带有三个参数:一个输入字符串、一个输出字符串和一个指明输出缓冲区的字符长度的参数。

图 3 所示为加注释的非托管GetShortPathName 函数文档,它同时指出了输入和输出字符串参数。它引出了托管的外部方法定义,也如图 3 所示。请注意第一个参数被封送为System.String,因为它是一个只用作输入的参数。第二个参数代表一个输出缓冲区,它使用了

System.StringBuilder。

小结

本月专栏所介绍的P/Invoke 功能足够调用Windows 中的许多API 函数。然而,如果您大量用到interop,则会最终发现自己封送了很复杂的数据结构,甚至可能需要在托管代码中通过指针直接访问内存。实际上,本机代码中的interop 可以是一个将细节和低级比特藏在里面的真正的潘多拉盒子。CLR、C# 和托管C++ 提供了许多有用的功能;也许以后我会在本专栏介绍高级的P/Invoke 话题。

同时,只要您觉得.NET Framework 类库无法播放您的声音或者为您执行其他一些功能,您可以知道如何向原始而优秀的Windows API 寻求一些帮助。

API(应用编程接口)是程序与处理器接口的命令集。最常用的就是在外部调用微软WINDOWS内部的进程。WINDOWS API包括成千的你可以使用的函数、结构、常量。这些函数是用C语言写的,在使用他们之前,你必须声明。定义Dll的进程将相当的复杂,甚至比VB还复杂。你可以使用API Viewer工具得到API函数的声明,但是必须注意的是,它的参数类型跟C#的不一样。大部分的高级语言都支持API,微软函数类库(MFC)封装了大部分的Win32 API。ODBC API对提高数据库的操作速度大有好处。使用API,可以请求更底层的系统服务。API从简单的对话框到复杂的加密运算都提供支持。开发者应该知道如何在他们程序中使用API

API有许多类型,(针对不同的操作系统、处理器…………)

OS specific API:

操作系统特有API:

每种操作系统都有一套公用API和专有API。比如:Windows NT 支持MS-DOS, Win16, Win32, POSIX (便携式操作系统接口),OS/2 console API ;同时Windows 95 supports MS-DOS, Win16 和Win32 API。

Win16 和Win32 API:

WIN16 是基于16位的处理器,并使用16位的值,它是一个独立的平台。比如:你可以运行TSR 程序在MS-DOS环境下。

WIN32 是基于32位的处理器,并使用32位的值。他可用于任何操作系统,它的使用范围更广。Win32 API has 32 prefix after the library name e.g. KERNEL32, USER32 etc?

Win32 API的DLL一般都具有32的后缀,比如:KERNEL32, USER32等。

所有的API都在下面3个DLL中实现的。

Kernel

User

GDI

1. KERNEL

它的库名是:KERNEL32.DLL,它是操作系统管理的API集

Process loading. 加载进程

Context switching.

File I/O. 文件操作

Memory management. 内存管理

比如:GlobalMemoryStatus 函数获得目前系统物理虚拟内存的使用信息。

2. USER

在WIN32下,它的库名是USER32.DLL

This allows managing the entire user interfaces such as

它管理全部的用户界面,比如:

Windows 窗口

Menus 菜单

Dialog Boxes 对话框

Icons etc., 图标等

比如:DrawIcon 画一个图标在指定的设备上。

3. GDI (Graphical Device Interface)

这个DLL是GDI32.dll,它负责图像的输出,使用GDI绘出窗口,菜单,对话框

It can create Graphical Output. 输出图像

比如:CreateBitmap 函数创建一个指定宽度、高度和颜色格式的位图。

C#中API的工具对初学者是相当不错的。在C#使用中使用API之前,你应该先知道C#中如何使用结构、类型转换,安全与不安全代码等。

使用复杂的api之前,我们先用一个简单的MessageBox API作为列子。打开一个C#工程,增加一个按钮,在按钮的点击事件中,我们将显示一个信息框。

增加使用外部库的命名空间:

using System.Runtime.InteropServices;

下面声明API

[DllImport("User32.dll")]

DllImport属性用来指定包含外部方法的动态连接库的位置。"User32.dll"指出了库名,static 指明它不属于特定的对象。extern 指明是一个外部的方法。带有DllImport 属性的方法必须带有修饰符extern 。

MessageBox 是一个汉数名,带四个参数返回一个int型值。

许多API使用结构来传递、返回参数,这样可以减少复杂度。它也允许使用象MessageBox 函数那样,使用固定的参数。

在按钮的点击事件中增加下面代码:

protected void button1_Click (object sender, System.EventArgs e)

{

MessageBox (0,"API Message Box","API Demo",0);

}

编译并运行程序,点击按钮以后,你就可以看到一个由API调用的信息框。

Using structure 使用结构

API中经常使用复杂的结构。不过一旦你明白了他们,将是很简单的。

In next example we will use GetSystemInfo API which returns information about the current system. 下面的列子,我们用GetSystemInfo API得到当前系统的信息。

第一步:增加一个C#窗口,并在上面增加一个按钮,在窗口代码页增加一个命名空间:

using System.Runtime.InteropServices;

声明GetSystemInfo 的参数结构:

[StructLayout(LayoutKind.Sequential)]

public struct SYSTEM_INFO {

public uint dwOemId;

public uint dwPageSize;

public uint lpMinimumApplicationAddress;

public uint lpMaximumApplicationAddress;

public uint dwActiveProcessorMask;

public uint dwNumberOfProcessors;

public uint dwProcessorType;

public uint dwAllocationGranularity;

public uint dwProcessorLevel;

public uint dwProcessorRevision;

}

声明API函数:

[DllImport("kernel32")]

static extern void GetSystemInfo(ref SYSTEM_INFO pSI);

ref是一个标志参量传递形式的关键字,它使传入传出的变量指向同一个变量(传址传递)

在按钮点击事件中增加下面的代码,

protected void button1_Click (object sender, System.EventArgs e)

{

try

{

SYSTEM_INFO pSI = new SYSTEM_INFO();

GetSystemInfo(ref pSI);

Once you retrieve the structure perform operations on required parameter

比如:

listBox1.Items.Insert(0,pSI.dwActiveProcessorMask.ToString());

}

catch(Exception er)

{

MessageBox.Show (er.Message);

}

}

用Visual C#调用Windows API函数

北京机械工业学院研00级(100085)冉林仓

Api函数是构筑Windws应用程序的基石,每一种Windows应用程序开发工具,它提供的底层函数都间接或直接地调用了Windows API函数,同时为了实现功能扩展,一般也都提供了调用WindowsAPI函数的接口,也就是说具备调用动态连接库的能力。Visual C#和其它开发工具一样也能够调用动态链接库的API函数。.NET框架本身提供了这样一种服务,允许受管辖的代码调用动态链接库中实现的非受管辖函数,包括操作系统提供的Windows API函数。它能够定位和调用输出函数,根据需要,组织其各个参数(整型、字符串类型、数组、和结构等等)跨越互操作边界。

下面以C#为例简单介绍调用API的基本过程:

动态链接库函数的声明

动态链接库函数使用前必须声明,相对于VB,C#函数声明显得更加罗嗦,前者通过Api Viewer 粘贴以后,可以直接使用,而后者则需要对参数作些额外的变化工作。

动态链接库函数声明部分一般由下列两部分组成,一是函数名或索引号,二是动态链接库的文件名。

譬如,你想调用User32.DLL中的MessageBox函数,我们必须指明函数的名字MessageBoxA 或MessageBoxW,以及库名字User32.dll,我们知道Win32 API对每一个涉及字符串和字符的函数一般都存在两个版本,单字节字符的ANSI版本和双字节字符的UNICODE版本。

下面是一个调用API函数的例子:

[DllImport("KERNEL32.DLL", EntryPoint="MoveFileW", SetLastError=true,

CharSet=CharSet.Unicode, ExactSpelling=true,

CallingConvention=CallingConvention.StdCall)]

public static extern bool MoveFile(String src, String dst);

其中入口点EntryPoint标识函数在动态链接库的入口位置,在一个受管辖的工程中,目标函数的原始名字和序号入口点不仅标识一个跨越互操作界限的函数。而且,你还可以把这个入口点映射为一个不同的名字,也就是对函数进行重命名。重命名可以给调用函数带来种种便利,通过重命名,一方面我们不用为函数的大小写伤透脑筋,同时它也可以保证与已有的命名规则保持一致,允许带有不同参数类型的函数共存,更重要的是它简化了对ANSI和Unicode版本的调用。CharSet 用于标识函数调用所采用的是Unicode或是ANSI版本,ExactSpelling=false将告诉编译器,让编译器决定使用Unicode或者是Ansi版本。其它的参数请参考MSDN在线帮助.

在C#中,你可以在EntryPoint域通过名字和序号声明一个动态链接库函数,如果在方法定义中使用的函数名与DLL入口点相同,你不需要在EntryPoint域显示声明函数。否则,你必须使用下列属性格式指示一个名字和序号。

[DllImport("dllname", EntryPoint="Functionname")]

[DllImport("dllname", EntryPoint="#123")]

值得注意的是,你必须在数字序号前加“#”

下面是一个用MsgBox替换MessageBox名字的例子:

[C#]

using System.Runtime.InteropServices;

public class Win32 {

[DllImport("user32.dll", EntryPoint="MessageBox")]

public static extern int MsgBox(int hWnd, String text, String caption, uint type);

}

许多受管辖的动态链接库函数期望你能够传递一个复杂的参数类型给函数,譬如一个用户定义的结构类型成员或者受管辖代码定义的一个类成员,这时你必须提供额外的信息格式化这个类型,以保持参数原有的布局和对齐。

C#提供了一个StructLayoutAttribute类,通过它你可以定义自己的格式化类型,在受管辖代码中,格式化类型是一个用StructLayoutAttribute说明的结构或类成员,通过它能够保证其内部成员预期的布局信息。布局的选项共有三种:

布局选项

描述

LayoutKind.Automatic

为了提高效率允许运行态对类型成员重新排序。

注意:永远不要使用这个选项来调用不受管辖的动态链接库函数。

LayoutKind.Explicit

对每个域按照FieldOffset属性对类型成员排序

LayoutKind.Sequential

对出现在受管辖类型定义地方的不受管辖内存中的类型成员进行排序。

传递结构成员

下面的例子说明如何在受管辖代码中定义一个点和矩形类型,并作为一个参数传递给User32.dll 库中的PtInRect函数,

函数的不受管辖原型声明如下:

BOOL PtInRect(const RECT *lprc, POINT pt);

注意你必须通过引用传递Rect结构参数,因为函数需要一个Rect的结构指针。

[C#]

using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential)]

public struct Point {

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;

}

class Win32API {

[DllImport("User32.dll")]

public static extern Bool PtInRect(ref Rect r, Point p);

}

类似你可以调用GetSystemInfo函数获得系统信息:

? using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential)]

public struct SYSTEM_INFO {

public uint dwOemId;

public uint dwPageSize;

public uint lpMinimumApplicationAddress;

public uint lpMaximumApplicationAddress;

public uint dwActiveProcessorMask;

public uint dwNumberOfProcessors;

public uint dwProcessorType;

public uint dwAllocationGranularity;

public uint dwProcessorLevel;

public uint dwProcessorRevision;

}

[DllImport("kernel32")]

static extern void GetSystemInfo(ref SYSTEM_INFO pSI);

SYSTEM_INFO pSI = new SYSTEM_INFO();

GetSystemInfo(ref pSI);

类成员的传递

同样只要类具有一个固定的类成员布局,你也可以传递一个类成员给一个不受管辖的动态链接库函数,下面的例子主要说明如何传递一个sequential顺序定义的MySystemTime类给User32.dll 的GetSystemTime函数, 函数用C/C++调用规范如下:

void GetSystemTime(SYSTEMTIME* SystemTime);

不像传值类型,类总是通过引用传递参数.

[C#]

[StructLayout(LayoutKind.Sequential)]

public class MySystemTime {

public ushort wYear;

public ushort wMonth;

public ushort wDayOfWeek;

public ushort wDay;

public ushort wHour;

public ushort wMinute;

public ushort wSecond;

public ushort wMilliseconds;

}

class Win32API {

[DllImport("User32.dll")]

public static extern void GetSystemTime(MySystemTime st);

}

回调函数的传递:

从受管辖的代码中调用大多数动态链接库函数,你只需创建一个受管辖的函数定义,然后调用它即可,这个过程非常直接。

如果一个动态链接库函数需要一个函数指针作为参数,你还需要做以下几步:

首先,你必须参考有关这个函数的文档,确定这个函数是否需要一个回调;第二,你必须在受管辖代码中创建一个回调函数;最后,你可以把指向这个函数的指针作为一个参数创递给DLL函数,.

回调函数及其实现:

回调函数经常用在任务需要重复执行的场合,譬如用于枚举函数,譬如Win32 API 中的EnumFontFamilies(字体枚举), EnumPrinters(打印机), EnumWindows (窗口枚举)函数. 下面以窗口枚举为例,谈谈如何通过调用EnumWindow 函数遍历系统中存在的所有窗口

分下面几个步骤:

1. 在实现调用前先参考函数的声明

BOOL EnumWindows(WNDENUMPROC lpEnumFunc, LPARMAM IParam)

显然这个函数需要一个回调函数地址作为参数.

2. 创建一个受管辖的回调函数,这个例子声明为代表类型(delegate),也就是我们所说的回调,它带有两个参数hwnd和lparam,第一个参数是一个窗口句柄,第二个参数由应用程序定义,两个参数均为整形。

当这个回调函数返回一个非零值时,标示执行成功,零则暗示失败,这个例子总是返回True 值,以便持续枚举。

3. 最后创建以代表对象(delegate),并把它作为一个参数传递给EnumWindows 函数,平台会自动地把代表转化成函数能够识别的回调格式。

[C#]

using System;

using System.Runtime.InteropServices;

public delegate bool CallBack(int hwnd, int lParam);

public class EnumReportApp {

[DllImport("user32")]

public static extern int EnumWindows(CallBack x, int y);

public static void Main()

{

CallBack myCallBack = new CallBack(EnumReportApp.Report);

EnumWindows(myCallBack, 0);

}

(完整版)工程经济公式汇总

工程经济计算公式汇总0921 1、利息I=F=P I-利息;(interest) F-目前债务人应付总金额,即还本付息总额; P-原借贷金额,即本金。(Principal) 2、利率i=It/P I-利率 It-单位时间内所得的利息额 3、单利It=P×i单 It-第t计息周期的利息额;P-本金;i单-计息周期单利利率4、第n期末单利本利和F=P+In=P(1+n×i单) In-n个计息周期所付或所收的单利总利息 5、复利It=i×F t-1 I-计息周期复利利率;F t-1——表示第(t-1)期末复利本利和。 6、第t期末复利本利和F t=F t-1×(1+i) 7、净现金流量(CI-CO)t 8、一次支付n年末终值(即本利和)F=P(1+i)n 其中(1+i)n称之为一次支付终值系数 9、等额支付系列现金流量 P=A1(1+i)-1+A2(1+i)-2+......+A n(1+i)-n=∑A t(1+i)-t F=∑A t(1+i)n-t=A[(1+i)n-1]/i 其中At=A=常数t=1,2,3,......,n A表示年金,发生在某一特定时间序列各计息期末(不包括零期)的等额资金序列的价值。 [(1+i)n-1]/1 称为等额支付系列终值系数或年金终值系数 10、名义利率r=i×m I-周期利率;m-计息周期数;r-名义利率 i=r/m 年本利和F=P(1+r/m)m 年利息I=f-P=P[(1+r/m)m-1] 年有效利率ieff=I/P=(1+r/m)m-1 11、投资收益率R=A/I A-技术方案年净收益额或年平均净收益额;I-技术方案投资 12、基准投资收益率Rc R>Rc 技术方案可行 R

儿童保护视力10方法

儿童保护视力10方法 一光线须充足:光线要充足舒适,光线太弱而因字体看不清就会越看越近。 二反光要避免:书桌边应有灯光装置,其目的在减少反光以降低对眼睛的伤害。 三阅读时间勿太长:无论做功课或看电视,时间不可太长,以每三十分钟休息片刻为佳。 四坐姿要端正:不可弯腰驼背,越靠近或趴着做功课易造成睫状肌紧张过度,进而造成近视。 五看书距离应适中:书与眼睛之间的距离应以30公分为准,且桌椅的高度也应与体格相配 合,不可勉强将就。 六看电视距离勿太近:看电视时应保持与电视画面对角线六~八倍距离,每30分钟必须休息片刻 七睡眠不可太少,作息有规律:睡眠不足身体容易疲劳,易造成假性近视。 八多做户外运动:经常眺望远外放松眼肌,防止近视,向大自然多接触青山绿野,有益于眼睛的健康。 九营养摄取应无均衡:不可偏食,应特别注意维生素B类(胚芽米、麦片酵母)之摄取。 十定期做视力:凡视力不正常者应至合格眼镜公司或眼科医师处做进一步的检查。 如何保护儿童视力 孩子得了近视眼,埋怨父母,是有一定道理的。 长期以来,已有不少调查证实,近视眼的发生有一定家族性,父母亲均为近视,子女患近视的多,父母亲均无近视,子女患近视的少,父母一方有近视,子女患近视介于上述两者之间。所以儿童近视眼与父母关系十分密切。 预防近视眼,要注意以下几点: (1)不要看字迹太小或模糊的书报。 (2)教育儿童改正不合理的用眼习惯,不良习惯都会使眼睛过度疲劳,降低视力的敏锐度。 (3)加强体格锻炼,增强身体素质,可以减轻减慢近视眼的发生,尤其是室外体育运动。让孩子在空气新鲜、视野开阔的郊外进行远眺,极目欣赏祖国的山河大地,也是

台式电脑常见故障维修大全

常见故障检修 01:主板故障 02:显卡故障 03:声卡故障 04:硬盘故障 05:内存故障 06:光驱故障 07:鼠标故障 08:键盘故障 09:MODEM故障 10:打印机故障 11:显示器故障 12:刻录机故障 13:扫描仪故障 14:显示器抖动的原因 15:疑难BIOS设置 16:电脑重启故障 17:解决CPU占用率过高问题 18:硬盘坏道的发现与修复 19:网页恶意代码的手工处理 20:集成声卡常见故障及解决 21:USB存储设备无法识别 22:黑屏故障 23:WINDOWS蓝屏代码速查表 24:WINDOWS错误代码大全 25:BIOS自检与开机故障问题 下面是相关的故障速查与解决问题 电脑出现的故障原因扑朔迷离,让人难以捉摸。并且由于Windows操作系统的组件相对复杂,电脑一旦出现故障,对于普通用户来说,想要准确地找出其故障的原因几乎是不可能的。那么是否是说我们如果遇到电脑故障的时候,就完全束手无策了呢?其实并非如此,使电脑产生故障的原因虽然有很多,但是,只要我们细心观察,认真总结,我们还是可以掌握一些电脑故障的规律和处理办法的。在本期的小册子中,我们就将一些最为常见也是最为典型的电脑故障的诊断、维护方法展示给你,通过它,你就会发现——解决电脑故障方法就在你的身边,简单,但有效! 一、主板 主板是整个电脑的关键部件,在电脑起着至关重要的作用。如果主板产生故障将会影响到整个PC机系统的工作。下面,我们就一起来看看主板在使用过程中最常见的故障有哪些。

常见故障一:开机无显示 电脑开机无显示,首先我们要检查的就是是BIOS。主板的BIOS中储存着重要的硬件数据,同时BIOS也是主板中比较脆弱的部分,极易受到破坏,一旦受损就会导致系统无法运行,出现此类故障一般是因为主板BIOS被CIH病毒破坏造成(当然也不排除主板本身故障导致系统无法运行。)。一般BIOS被病毒破坏后硬盘里的数据将全部丢失,所以我们可以通过检测硬盘数据是否完好来判断BIOS是否被破坏,如果硬盘数据完好无损,那么还有三种原因会造成开机无显示的现象: 1. 因为主板扩展槽或扩展卡有问题,导致插上诸如声卡等扩展卡后主板没有响应而无显示。 2. 免跳线主板在CMOS里设置的CPU频率不对,也可能会引发不显示故障,对此,只要清除CMOS即可予以解决。清除CMOS的跳线一般在主板的锂电池附近,其默认位置一般为1、2短路,只要将其改跳为2、3短路几秒种即可解决问题,对于以前的老主板如若用户找不到该跳线,只要将电池取下,待开机显示进入CMOS设置后再关机,将电池上上去亦达到CMOS放电之目的。 3. 主板无法识别内存、内存损坏或者内存不匹配也会导致开机无显示的故障。某些老的主板比较挑剔内存,一旦插上主板无法识别的内存,主板就无法启动,甚至某些主板不给你任何故障提示(鸣叫)。当然也有的时候为了扩充内存以提高系统性能,结果插上不同品牌、类型的内存同样会导致此类故障的出现,因此在检修时,应多加注意。 对于主板BIOS被破坏的故障,我们可以插上ISA显卡看有无显示(如有提示,可按提示步骤操作即可。),倘若没有开机画面,你可以自己做一张自动更新BIOS的软盘,重新刷新BIOS,但有的主板BIOS被破坏后,软驱根本就不工作,此时,可尝试用热插拔法加以解决(我曾经尝试过,只要BIOS相同,在同级别的主板中都可以成功烧录。)。但采用热插拔除需要相同的BIOS外还可能会导致主板部分元件损坏,所以可靠的方法是用写码器将BIOS 更新文件写入BIOS里面(可找有此服务的电脑商解决比较安全)。 常见故障二:CMOS设置不能保存 此类故障一般是由于主板电池电压不足造成,对此予以更换即可,但有的主板电池更换后同样不能解决问题,此时有两种可能: 1. 主板电路问题,对此要找专业人员维修; 2. 主板CMOS跳线问题,有时候因为错误的将主板上的CMOS跳线设为清除选项,或者设置成外接电池,使得CMOS数据无法保存。 常见故障三:在Windows下安装主板驱动程序后出现死机或光驱读盘速度变慢的现象 在一些杂牌主板上有时会出现此类现象,将主板驱动程序装完后,重新启动计算机不能以正常模式进入Windows 98桌面,而且该驱动程序在Windows 98下不能被卸载。如果出现这

建设工程经济公式汇总

一级建造师《建设工程经济》计算公式汇总 1、单利计算 式中It——代表第t计息周期的利息额;P——代表本金;i单——计息周期单利利率。 2、一次支付的终值和现值计算 ①终值计算(已知P求F即本利和) ②现值计算(已知F求P) 3、等额支付系列的终值、现值、资金回收和偿债基金计算 等额支付系列现金流量序列是连续的,且数额相等,即: ①终值计算(即已知A求F) ②现值计算(即已知A求P) ③资金回收计算(已知P求A) ④偿债基金计算(已知F求A) 4、名义利率r 是指计息周期利率:乘以一年内的计息周期数m所得的年利率。即: 5、有效利率的计算 包括计息周期有效利率和年有效利率两种情况。 (1)计息周期有效利率,即计息周期利率i,由式(1Z101021)可知(1Z101022-1) (2)年有效利率,即年实际利率。 年初资金P,名义利率为r,一年内计息m次,则计息周期利率为。根据一次支付终值公式可得该年的本利和F,即:根据利息的定义可得该年的利息I 再根据利率的定义可得该年的实际利率,即有效利率ieFF 6、财务净现值(1Z101035) 式中FNPV——财务净现值; (CI-CO)t——第t年的净现金流量(应注意“+”、“-”号); ic——基准收益率; n——方案计算期。 7、财务内部收益率(FIRR——FinanciallnternaIRateoFReturn) 其实质就是使投资方案在计算期内各年净现金流量的现值累计等于零时的折现率。其数学表达式为:(1Z101036-2) 式中FIRR——财务内部收益率。 8、投资收益率指标的计算 是投资方案达到设计生产能力后一个正常生产年份的年净收益总额(不是年销售收入)与方案投资总额(包括建设投资、建设期贷款利息、流动资金等)的比率:(1Z101032-1)

常见电脑问题汇总

常见电脑问题汇总 一、硬件方面 1、开机后显示器没有任何显示。 答:出来这种情况一搬都是硬件故障,主要原因为内存条有问题(计算机中出现问题的硬件一搬是内存条、盘、显卡、主盘、电源这几个大的器件,其中内存条出现问题的机会和可能性最大,出来这样的情况处理方法为:扒下内存,再开机,看系统会不会报内存错误,如果报错,说明是内存原因,可以把内存的金手指用干净的白纸擦拭干净后,插到电脑里面,再次开机一搬都可以解决问题。如果还不能解决问题,就更换一根内存条。 2、内存条是好的,开机后显示器没有任何显示。 答:出现这种情况,有可能是BIOS出现了问题,电脑使用时间长了,主板上的BIOS电池可能会因为掉电而倒至内面的设置出错,从而使计算机无法启动。解决方法是:清一次BIOS 电,(靠近BIOS电池的跳线从1、2跳2、3再跳到1、2) 3、能够听到计算机启动报警的声音,但是显示器什么显示都没有。 答:计算机启动最开始是一个系统自检的程序,自检通过就会有“嘟”的一声报警,如果计算机启动过程中能听到这声报警,说明计算机能够正常启动。以下情况说明中已听到报警声,说明计算机的主机部份没有问题。这时候显示器还不亮就说明是显示器的问题,请换一台好的显示器试试。 4、计算机能正常亮,但是,启动过程中报错,“disk boot fail” 答:出现这种提示,一搬是计算机的引导部份出现问题,可能出现的问题有:1、BIOS中设置的第一引导项是cdrom,而cdrom中又没有可启动的光盘,解决方法是:开机后按“DEL”键,时入BIOS,把第一启动项改成硬盘启动。

5、计算机能正常亮,BIOS设置也是正确的,但是,启动过程中报错,“disk boot fail”答:出这种问题,就要检查一下你的硬盘是不是好的了,或者说你的硬盘的C盘中的引导程序被破环了。解决方法:重新安装一次操作系统,或者更换一个新的硬盘。 6、开机后,系统出现“花屏” 答:开机系统出现花屏现像一搬都是显卡问题,这时可直接更换一块显卡,并重新安装驱动程序。 7、我的计算机只要放入光盘后,计算机就“死机了” 答:出现这样的情况,一搬是光盘的原因,或者是光驱的原因,解决办法为: 用一张好的,没有划伤的正版光盘试一试看看能不能读得出来,如果用一张好的光驱还是读不出来,就说明是光驱的问题,如果换一张光盘后,能够读得出来说明光驱是好的,而光盘是坏的, 8、开机后计算机没有任何反应,CPU风扇也不转了。 答:出现这种情况,一搬是因为电源有问题,这时可以换一个好的电源来试试。 9、开机后计算机没有任何反应,CPU风扇在转,这时要确定内存是好的。 答:出现这种问题,一搬比较棘手,因为出现这种问题的原因很多,有可能,是CPU有问题,也有可能是主板有问题,这时只能用排除法来解决:先换一个好的CPU到电脑上去试试,现换一块子的主板到电脑上去试一试。这样,总可以找出到底是那个地方出现问题。 二、网络问题 1、IE主页被修改了。 答:点击IE右键,属性。在主页选项框中点击使用空白主页就可 2、系统老是自动弹出网页

一建工程经济公式汇总

1、等值(现值与终值计算)四个公式记住,必考点 ①一次支付(只有一笔钱)的终值F=P(1+i)n 或F=P(F/P,i,n); ②一次支付(只有一笔钱)的现值P=F(1+i)n 或P=F(P/F,i,n); ③等额支付(有几笔钱或复利)的终值F=A (1+i)^n-1 i 或F=A(F/A,i,n); ④等额支付(有几笔钱或复利)的现值P=A (1+i)^n-1 i(1+i)^n 或P=A(P/A,i,n)。 F —终值,P —现值,r —计息周期利率, m —一年的计息次数,i —计息周期利率,i eff —年有效利率,n —计息期数 2、.静态分析指标 投资收益率:总投资收益率=(息+税前利润)÷总投资×100% 资本金净利润率=(利润-税)÷资本金×100% 静态投资回收期:P t =(T -1)+|T -1|年累计净现金流量的绝对值/T 年的净现金流量,T 为首次≥0的年数。 总投资额=建设投资+建设期利息+全部流动资金 3、动态分析指标: 财务净现值=现金流入现值合计—现金流出现值合计 =∑n 年×[1/(1+基准收益率)n ] FNPV ≥0经济上可行,FNPV <0经济上不可行。 财务内部收益率是指:方案在计算期内各年净现金流量的现值累计等于零时的折现率。 FIRR ≥ic 经济上可行,FIRR <ic 经济上不可行。 4、量本利模型公式:B =PQ -[(C u +T u )Q +C F ], 利润=单价×产量-[(变动成本+税收)×产量+固定成本] 当B=0时即为产销量的盈亏平衡点 5、总成本费用=外购原材料、燃料动力费+工资+修理费+折旧费+摊销费+财务支出(利息)+其他费用 6、经营成本=总成本费用—折旧费—摊销旨—利息支出 或 =外购原材料、燃料费+工资+修理费+其他费 折旧额(年)=应计折旧额÷使用年限 7、沉没成本=设备账面价值-当前市场价值 或 沉没成本=(设备原值-历年累计折旧)-当前市场价值 8、经济寿命N 0=√2(P-L N )/λ P —帐面价值,L N —第N 年净残值,λ—年递增的运行成本(劣化值) 设备年平均使用成本=累计运行成本N 年 +帐面价值-残值 N 年 9、租金的计算方法有:附加率法和年金法。 附加率法:租金R=租价(1+N 年×折现率) N 年 +租价×附加率 年金法:①年末支付Ra=租价折现率(1+折现率) (1+折现率)-1 ②年初支付Rb=租价折现率(1+折现率)(1+折现率)-1 =Ra 1+折现率 10、价值工程中V i =F i /C i =功能/成本 V i =1,最佳,V i <1,成本偏高,V i >1,成本较小 11、增量投资收益率(R 2-1),R 2-1=C1-C2 I2-I1 ×100%, C1、C2为新旧方案的经营(或生产)成本,I1、I2为新旧方案的投资额。 (1)当方案要增加投资时,通过公式计算比较,选择折算费用最小的方案。 折算费用法:Z j =生产成本+用于第j 方案的投资额×基准投资收益率 (2)在采用方案不增加投资时,可通过比较各方案生产成本的大小选择方案。 Z j = C j =固定成本总额+第j 方案单位产量的可变成本×产量 12、静态会计等式公式“资产=负债+所有者权益”, 动态会计“收入一费用=利润” 综合会计等式“资产=负债+(所有者利益+收入-费用) 13、施工企业常用的工作量法有两种 行驶里程法:单位里程折旧额=应计折旧额/总行驶里程

建设工程经济计算公式汇总

一级建造师《建设工程经济》计算公式汇总 1、等额支付系列的终值、现值、资金回收和偿债基金计算 等额支付系列现金流量序列是连续的,且数额相等,即: ) ,,,,常数(n t A A t 321 ①终值计算(即已知A 求F ) i i A F n 11 )( ②现值计算(即已知A 求P ) n n n i i i A i F P )()() ( 1111 ③资金回收计算(已知P 求A ) 111 n n i i i P A )() ( ④偿债基金计算(已知F 求A ) 1 1 n i i F A )( 2、有效利率的计算 包括计息周期有效利率和年有效利率两种情况。 (2)年有效利率,即年实际利率。 年初资金P ,名义利率为r ,一年内计息m 次,则计息周期利率为 m r i 。根据一次支付终值公式可得该年的本利和F ,即: m m r P F 1 根据利息的定义可得该年的利息I 为: 111m m m r P P m r P I 再根据利率的定义可得该年的实际利率,即有效利率i eFF 为: 11i eff m m r P I 3、财务净现值 t c t n t i CO CI FNPV 10 式中 FNPV ——财务净现值; (CI-CO )t ——第t 年的净现金流量(应注意“+”、“-”号); i c ——基准收益率; n ——方案计算期。 4、财务内部收益率(FIRR ——Financial lnternaI Rate oF Return ) 其实质就是使投资方案在计算期内各年净现金流量的现值累计等于零时的折现率。其数学表达式为:

t t n t FIRR CO CI FIRR FNPV 10 式中 FIRR ——财务内部收益率。 5、投资收益率指标的计算 是投资方案达到设计生产能力后一个正常生产年份的年净收益总额(不是年销售收入)与方案投资总额(包括建设投资、建设期贷款利息、流动资金等)的比率: %100 I A R 式中 R ——投资收益率; A ——年净收益额或年平均净收益额; I ——总投资 6、总投资收益率 总投资收益率(ROI )表示总投资的盈利水平 %100 TI EBIT ROI 式中 EBIT-----技术方案正常年份的年息税前利润或运营期内平均息税前利润; TI------技术方案总投资包括建设投资、建设期利息和全部流动资金。 7、资本金净利润率(ROE ) 技术方案资本金净利润率(ROE )表示技术方案盈利水平 %100 EC NP ROE 式中 NP----技术方案正常年份的年净利润或运营期内年平均净利润, 净利润=利润总额-所得税 EC----技术方案资本金 8、静态投资回收期 ·当项目建成投产后各年的净收益(即净现金流量)均相同时,静态投资回收期计算: A I P t 式中 I ——总投资; A ——每年的净收益。 ·当项目建成投产后各年的净收益不相同时,静态投资回收期计算: 流量 出现正值年份的净现金的绝对值 上一年累计净现金流量现正值的年份数累计净现金流量开始出 1- t P 9、借款偿还期 余额 盈余当年可用于还款的盈余当年应偿还借款额 的年份数借款偿还开始出现盈余 1-d P 10、利息备付率 利息备付率=息税前利润/计入总成本费用的应付利息。 式中:息税前利润——即利润总额与计入总成本费用的利息费用之和(不含折旧、摊销费 11、偿债备付率 偿债备付率=(息税前利润加折旧和摊销-企业所得税)/应还本付息的金额 式中:应还本付息的资金——包括当期还贷款本金额及计入总成本费用的全部利息; 息税前利润加折旧和摊销-企业所得税=净利润+折旧+摊销+利息 12、总成本 C =C F +C u ×Q C :总成本;C F :固定成本;C u :单位产品变动成本;Q :产销量 量本利模型

(完整版)电脑常见硬件故障大全,推荐文档

电脑常见硬件故障大全 硬件故障是每个计算机用户都不愿意面对,却又不得不面对的一道“难题”。其实,解决这些问题并不一定需要非常高深的专业知识,小编为大家分享了电脑常见硬件故障大全,希望大家喜欢。? 电脑常见硬件故障大全 ? Ⅰ、如果电脑无法开机,而且CPU风扇不转动,则有可能是电源有故障或者电源线没有接好。排除故障的方法:更换电源来排除故障。 ? Ⅱ、如果开机后电源指示灯亮,CPU风扇正常转动,但显示器无显示,无声响,那么就有一下两种可能: ? (1) CUP或内存接触不良。排除故障的方法:检查重新安装或更换CPU、内存条看是否能解除故障。 ? (2) 内存、PCI-e或PCI的工作频率与外频不相匹配,发生故障。故障排除方法:一般先进行CMOS放电把CMOS还原成默认设置(注意:放电时一定要把电源线拔出)。重新开机,再试试看

看故障是否排除。 ? ? ? Ⅲ、如果开机后,屏幕有反映,但是屏幕只显示一下黑屏和英文就停下来了即不能完成自检,那么就很可能是主板有故障。? ?

? Ⅳ、如果开机后,屏幕没有显示即完全不能自检,并伴有声响,那么可能是以下两种情况: ? a、伴有两长一短声时,很可能是显示卡接触不良。排除故障的方法:关闭主机电源后,松开显示卡金属挡板上的固定螺丝,插好后,再拧紧螺丝。然后开机,再试试。 ? b、伴有一长声,则可能是内存条未插好,关闭主机电源重新插好内存条。 ? ? ? Ⅴ、如果开机自检过程中,屏幕提示:“harddisknot present”或“Hard disk drive failure”或“Hard drive

保护视力,从我做起教案-共15页

“让心灵之窗更明亮”爱眼护眼主题班会教案 一、班会教学目的: 1、初步了解眼睛构造,知道视力对学习、生活的重要性。 2、培养科学用眼的意识,养成正确用眼、认真做眼操的好习惯。 3、学会爱护自己的眼睛,保护视力,同时爱护自己。 二、班会准备: 让学生分小组从家长及课外书中去查找一些关于眼睛的各方面的资料,做眼睛保健操的正确的动作,并获得一些有关眼睛保健方面的知识。 拍摄三位家长有关近视的录像,一位医生解说近视成因的录像 三、班会过程: 1、导入——观看有关家长视力不好的视频,谈感受: 敬爱的老师,亲爱的同学:大家好!今天的班会课由我们俩为大家主持。 先请大家观看几段录像。(a说说自己得近视的原因;b一位家长说说从小的理想是当一名飞行员,但因为近视无法实现自己的梦想;c在生活中近视给自己带来诸多的不便,如雨天,镜片遇雨水模糊。吃热腾腾的食物时,镜片也糊了等。)看了这几段录像,你有什么感受吗?生谈感受 预设:我觉得如果近视了,对我们的生活很有影响;我想我得好好爱护我的眼睛了。…… 主持人点评,小结:听了爸爸妈妈们的心声,我们更加明白了视力的重要。 2、宣布主题,班会开始: 同学们,我们之所以能看到如此五彩缤纷的世界,正是因为我们每个人都拥有一双明亮的眼睛。我们交流时,眼睛是表情达意的好帮手,因此它也被人称做是心灵之窗。可是,如果我们视力不好,就会看不清身边的一切,必须戴上眼镜,严重的还会失明,多可怕啊!所以今天我们一起来召开一个主题班会,说说心灵之窗——我们的眼睛。 《让心灵之窗更明亮》主题班会,现在开始! 3、了解眼睛构造:

我们天天都用到眼睛,看到身边的一切,那眼睛到底是什么样子的? 下面我们先来听听第一小组(4人)的介绍。他们介绍的是“眼睛的构造”点击出示眼睛结构图 A、这是眼睛的结构图,这是结膜、虹膜、角膜,这是房水、晶状体、视网膜、巩膜,这是视神经。眼睛是一个复杂器官,我们要掌握的三个重要概念是角膜,晶状体和视网膜。(分别点指) B、我来介绍角膜,角膜就像是相机的镜头,是位于眼球前壁的一层透明膜,它将光线传递并集中到眼睛里。 4、了解视力受损的严重性 原来我们的眼睛是个如此复杂的器官,要想清晰地看到事物,看到美好的大自然,还真要注意保护了。要是视力受损,,后果可真是不堪设想。刚才爸爸妈妈们已经谈了自己的感受,同学们,你们知道视力不好,有哪些后果吗? 预设: 1、老师写在黑板上的板书看不见 2、我长大想当警察,要是视力不好,就不能当警察了 3、广告牌上的字都看不清…… 鼓励学生大胆表达所了解的视力受损的严重性,发散性;主持人要灵活地点评。 同学们刚才说得很好,但视力不好的后果还不止这些,瞧(点击出示六条危害)赶快自己读读吧。 请六位同学读,每人读一条。 5、了解视力受损的原因 视力不好,给我们的生活和学习带来很多的不便和麻烦,那么到底是什么原因造成了视力受损呢?让我们来听一听医生是怎么说的吧?(播放解说一般情况下视力受损的原因DV) 听了医生的解说,你知道了近视有哪些原因呢?随机点评。 同学们可以对照着改变一下自己用眼的坏习惯,对我们的眼睛肯定有帮助。听了专家的介绍,再来让我们听一听同学的心声吧。

电脑故障维修大全:细数电脑常见故障的维修技巧大全

目前电脑变的非常普及,使用的人多了,也难免会遇到各种各样的电脑故障,一般很多情况的电脑故障都只是小问题,只要了解一些电脑故障的解决技巧,很多时候都可以自己解决。电脑百事网编辑推荐本文的目的是希望大家能够养成自己思考问题的习惯,并不是每次电脑出现电脑小故障都需要去求助别人,因为很多时候别人或许也不懂或者很忙,废话不多说,一起来学习下电脑常见故障的诊断方法,实在搞不定,再求助也不迟。 热点阅读:电脑故障维修大全:细数电脑常见故障的维修技巧大全 电脑常见故障排除学习方法汇总 1、电源插座、开关很多外围设备都是独立供电的,运行电脑时只打开计算机主机电源是不够的。例如:显示器电源开关未打开,会造成“黑屏”和“死机”的假象;外置式MODEM 电源开关未打开或电源插头未插好则不能拨号、上网、传送文件,甚至连MODEM都不能被识别。打印机、扫描仪等都是独立供电设备,碰到独立供电的外设故障现象时,首先应检查设备电源是否正常、电源插头/插座是否接触良好、电源开关是否打开。 2、连线问题外设跟计算机之间是通过数据线连接的,数据线脱落、接触不良均会导致该外设工作异常。如:显示器接头松动会导致屏幕偏色、无显示等故障;又如:打印机放在计算机旁并不意味着打印机连接到了计算机上,应亲自检查各设备间的线缆连接是否正确。 3、设置问题例如:显示器无显示很可能是行频调乱、宽度被压缩,甚至只是亮度被调至最暗;音箱放不出声音也许只是音量开关被关掉;硬盘不被识别也许只是主、从盘跳线位置不对……。详细了解该外设的设置情况,并动手试一下,有助于发现一些原本以为非更换零件才能解决的问题。 4、系统新特性很多“故障”现象其实是硬件设备或操作系统的新特性。如:带节能功能的主机,在间隔一段时间无人使用计算机或无程序运行后会自动关闭显示器、硬盘的电源,在你敲一下键盘后就能恢复正常。如果你不知道这一特征,就可能会认为显示器、硬盘出了

工程经济公式汇总讲解及例题汇总

工程经济公式汇总讲解及例题 1、单利计算: 所谓单利是指在计箅利息时,仅用最初本金来计算, 而不计入先前计息周期中所累积增加的利息,即通常所说的“利 不生利”的计息方法。 2、复利计算:所谓复利是指在计算某一计息周期的利息时,其先前 周期上所累积的利息要计算利息,即“利生利”、“利滚利”的计息 方式。 3.一次支付的终值和现值计算 ①终值计算(已知P求F即本利和) ②现值计算(已知F求P) 4.等额支付系列的终值、现值、资金回收和偿债基金计算 等额支付系列现金流量序列是连续的,且数额相等,即:零存整取 ①终值计算(即已知A求F)(每年年末存X,求Y年末本利和) ②现值计算(即已知A求P)(每年年末等额收X,求开始投资Y) 【例题】某企业欲投资一项目,预计2年后项目投入运营并获利,项目运营期为10年,各年净收益为500万元,每年净收益的80%可用于偿还贷款。银行贷款年利率为6%,复利计息,借款期限为6年。如运营期各年年末还款,该企业期初最大贷款额度为()。 A.1234 万元 B.1308万元 C.1499 万元 D.1589万元 答案:A (1)每年净收益500万元,80%用于偿还贷款,实每年还款额为400万 (2)项目期初贷款,建设期2年,借款期限6年,则实际还款只有4年 (3)最大贷款额即在还款期限内有偿还能力的借款额,为四年还款额的现值: ③资金回收计算(已知P求A)

④偿债基金计算(已知F求A) [2006年真题] 下列关于现值P、终值F、年金A、利率i、计息期数n之间关系的描述中,正确的是()。 A.F一定、n相同时,i越高、P越大 B.P一定、n相同时,i越高、F越小 C.i、n相同时,F与P呈同向变化 D.i、n相同时,F与P呈反向变化答案:C 【例题】在资金时间价值计算时,i和n给定,下列等式中正确的有()。 A.(F/A,i,n)=[(P/F,i,n)(A/p,i,n)] B.(A/P,i,n)=(A/F,i,n)+i C.(A/F,i,n)=(A/P,i,n)-i D.(F/P,i,n)=(A/P,i,n)/(F/A,i,n) E.(A/P,i,n)(F/A,i,n)=(P/F,i,n) 答案:A、B、C、D 5、名义利率r是指计息周期利率i乘以一年内的计息周期数m所得的年利率。有效利率是指资金在计息中所发生的实际利率,包括计息周期有效利率和年有效利率两种情况。?i=是指计息周期利率i乘以一年内的计息周期数m所得的年利率。 (1)计息周期有效利率,即计息周期利率i (2)年有效利率,即年实际利率。

(完整word版)电脑常见硬件故障大全,推荐文档

电脑常见硬件故障大全 硬件故障是每个计算机用户都不愿意面对,却又不得不面对的一道“难题”。其实,解决这些问题并不一定需要非常高深的专业知识,小编为大家分享了电脑常见硬件故障大全,希望大家喜欢。 电脑常见硬件故障大全 Ⅰ、如果电脑无法开机,而且CPU风扇不转动,则有可能是电源有故障或者电源线没有接好。排除故障的方法:更换电源来排除故障。 Ⅱ、如果开机后电源指示灯亮,CPU风扇正常转动,但显示器无显示,无声响,那么就有一下两种可能: (1) CUP或内存接触不良。排除故障的方法:检查重新安装或更换CPU、内存条看是否能解除故障。 (2) 内存、PCI-e或PCI的工作频率与外频不相匹配,发生故障。故障排除方法:一般先进行CMOS放电把CMOS还原成默认设置(注意:放电时一定要把电源线拔出)。重新开机,再试试看看故

障是否排除。 Ⅲ、如果开机后,屏幕有反映,但是屏幕只显示一下黑屏和英文就停下来了即不能完成自检,那么就很可能是主板有故障。

Ⅳ、如果开机后,屏幕没有显示即完全不能自检,并伴有声响,那么可能是以下两种情况: a、伴有两长一短声时,很可能是显示卡接触不良。排除故障的方法:关闭主机电源后,松开显示卡金属挡板上的固定螺丝,插好后,再拧紧螺丝。然后开机,再试试。 b、伴有一长声,则可能是内存条未插好,关闭主机电源重新插好内存条。 Ⅴ、如果开机自检过程中,屏幕提示:“harddisknot present”或“Hard disk drive failure”或“Hard drive controller

failure”或类似信息,则可能是硬盘驱动器的硬件故障。排除故障的方法:可以通过检查硬盘的连接线、或更换硬盘、或者调整CMOS 设置。 Ⅵ、如果开机自检过程中,屏幕提示“Missing operating system”、“Non system disk or disk error”或类似信息,则很可能是硬盘主引导分区表被破坏或者是操作系统损坏。解决办法是:重新安装操作系统。

建设项目工程经济计算公式汇总

.. 一级建造师《建设工程经济》计算公式汇总 1、等额支付系列的终值、现值、资金回收和偿债基金计算 等额支付系列现金流量序列是连续的,且数额相等,即: ) ,,,,常数(n t A A t 321①终值计算(即已知 A 求F ) i i A F n 1 1 )(②现值计算(即已知 A 求P ) n n n i i i A i F P ) ()() (1111 ③资金回收计算(已知 P 求A ) 1 1 1 n n i i i P A )()(④偿债基金计算(已知 F 求A ) 1 1 n i i F A ) (2、有效利率的计算 包括计息周期有效利率和年有效利率两种情况。(2)年有效利率,即年实际利率。年初资金P ,名义利率为r ,一年内计息m 次,则计息周期利率为 m r i 。根据一次支付终值公式可得该年的 本利和F ,即: m m r P F 1 根据利息的定义可得该年的利息I 为: 1 1 1 m m m r P P m r P I 再根据利率的定义可得该年的实际利率,即有效利率 i eFF 为: 1 1 i eff m m r P I 3、财务净现值 t c t n t i CO CI FNPV 1 式中 FNPV ——财务净现值; (CI-CO )t ——第t 年的净现金流量(应注意“+” 、“-”号); i c ——基准收益率;n ——方案计算期。

.. 4、财务内部收益率(FIRR ——Financial lnternaI Rate oF Return ) 其实质就是使投资方案在计算期内各年净现金流量的现值累计等于零时的折现率 。其数学表达式为: t t n t FIRR CO CI FIRR FNPV 10 式中 FIRR ——财务内部收益率。 5、投资收益率指标的计算 是投资方案达到设计生产能力后一个正常生产年份的年净收益总额( 不是年销售收入)与方案投资总额(包括 建设投资、建设期贷款利息、流动资金等) 的比率: % 100I A R 式中 R ——投资收益率; A ——年净收益额或年平均净收益额;I ——总投资 6、总投资收益率 总投资收益率(ROI )表示总投资的盈利水平 % 100TI EBIT ROI 式中 EBIT-----技术方案正常年份的年息税前利润或运营期内平均息税前利润; TI------技术方案总投资包括建设投资、建设期利息和全部流动资金。7、资本金净利润率( ROE ) 技术方案资本金净利润率( ROE )表示技术方案盈利水平 % 100EC NP ROE 式中 NP----技术方案正常年份的年净利润或运营期内年平均净利润,净利润=利润总额-所得税 EC----技术方案资本金 8、静态投资回收期 ·当项目建成投产后各年的净收益(即净现金流量)均相同时,静态投资回收期计算: A I P t 式中 I ——总投资;A ——每年的净收益。 ·当项目建成投产后各年的净收益不相同时,静态投资回收期计算: 流量 出现正值年份的净现金 的绝对值 上一年累计净现金流量 现正值的年份数 累计净现金流量开始出 1 -t P 9、借款偿还期 余额 盈余当年可用于还款的 盈余当年应偿还借款额的年份数 借款偿还开始出现盈余 1 -d P 10、利息备付率 利息备付率=息税前利润 /计入总成本费用的应付利息。 式中:息税前利润——即利润总额与计入总成本费用的利息费用之和(不含折旧、摊销费 11、偿债备付率 偿债备付率=(息税前利润加折旧和摊销-企业所得税)/应还本付息的金额 式中:应还本付息的资金——包括当期还贷款本金额及计入总成本费用的全部利息; 息税前利润加折旧和摊销 -企业所得税=净利润 +折旧+摊销+利息

保护视力方法大全

保护视力方法大全 保护视力的运动 一、转眼法: 选一安静场所,或坐或站,全身放松,清除杂念,二目睁开,头颈不动,独转眼球。先将眼睛凝视正下方,缓慢转至左方,再转至凝视正上方,至右方,最后回到凝视正下方,这样,先顺时针转9圈。再让眼睛由凝视下方,转至右方,至上方,至左方,再回到下方,这样,再逆时针方向转6圈。总共做4次。每次转动,眼球都应尽可能地达到极限。这种转眼法可以锻炼眼肌,改善营养,使眼灵活自如,炯炯有神。(注意:头颈不动,极力,慢,转到后颈发酸时,立即按摩颈部,直至酸感消失。) 二、眼呼吸凝神法: 选空气清新处,或坐或立,全身放松,二目平视前方,徐徐将气吸足,眼睛随之睁大,稍停片刻,然后将气徐徐呼出,眼睛也随之慢慢微闭,连续做9次。 三、熨眼法: 此法最好坐着做,全身放松,闭上双眼,然后快速相互摩擦两掌,使之生热,趁热用双手捂住双眼,热散后两手猛然拿开,两眼也同时用劲一睁,如此3~5次,能促进眼睛血液循环,增进新陈代谢。 坚持天天做,保护好眼睛。 看不见不要眯眼看,那样最容易近视。 四、提倡望远训练。少年眼球处于生长发育阶段,调节力很强,每天可进行一定时间的望远训练。如清晨眺望远处的建筑物或树木,或在夜晚辨认天空的星斗,还可以在日常休息时对远处某一目标进行辨认,认真对待望远训练并持之以恒,对预防近视眼的发生和发展是很有收益的。 眼疲劳食疗验方 1.黑豆粉1匙,核桃仁泥1匙,牛奶1标,蜂蜜1匙。制法:黑豆500克,炒熟后待冷,磨成粉。核桃仁500克,炒微焦去衣,待冷后捣如泥。取以上两种食品各1匙,冲入煮沸过的牛奶1杯后加入蜂蜜1匙。吃法:早晨或早餐后服。或当早餐,另加早点。说明:黑豆含有丰富蛋白质与维生素B1等,营养价值高,又因黑色食物入肾,配合核桃仁,可增加补肾力量,再加上牛奶和蜂蜜,这些食物含有较多的维生素B1、钙、磷等,能增强眼内肌力、加强调节功能,改善眼疲劳的症状。 2.枸杞子10克,桑椹子10克,山药10克,红枣10个。制法:将上述四种药物水煎两次

2014工程经济公式总结

工程经济公式总结 1.资金的时间价值计算 2.投资回收期 有现金流量表: 无现金流量表: 3.差额投资回收期 产量相同时: 产量不同时: Q 为产量 4.净现值法: 净现值(NPV)就是将技术方案的整个分析期内不同时点上的净现金流量按基准收益率折算到基准年的现值之和。 计算公式为: 项目分析期内年净现金流量相等 Kp-投资现值 Bt-年等额收益 Ct-年等额支出 L-残值 in-基准收益率 n-寿命 项目分析期内每年净现金流量不等: Ft-t 年的净现金流量 t-现金流量发生年份 5.内部收益率法 202 ' 101'1 01 2 02Q C Q C Q K Q K P a - - =

内部收益率又称内部报酬率,是指方案的净现值等于零时的收益率。即 6.年值法(AW):用于项目的收和支出皆为已知,在进行方案比较时,分别计算各比较方案净效益的等额年值,然 后进行比较,以年值较大的方案为优。 公式为: AW=NPV(A/P,i,n) 其中NPV是净现值,(A/P, i,n)是资本回收系数。 7.年费用比较法(AC法):和年值法相似,用于技术方案的逐年收益无法或无需核算时,以计算各方案所耗费 用来进行比较,并以费用最小的方案作为选优的标准。年费用比较法就是将各技术方案寿命周期内的总费用换算成等额年费用值(年值),并以等额年费用最小的方案作为最优方案。 Act=Ko(A/P,i,n)-KL(A/F,I,n)+c’ Act-年费用 Ko-投资额 KL-残值 c’-等额年费用 8.盈亏平衡分析法 基本公式:B=R-C=P*Q-(F+V*Q+T*Q) F——固定成本V——单位变动成本P——产品单价 Q——产品销售量 B——利润 R——总营业收入 C——总成本收入 T——单位产品营业税金及附加 则年产量的盈亏平衡点为:BEP Q=F/(P-V-T) 营业收入的盈亏平衡点为:BEP R=P*F/(P-V-T) 盈亏平衡点的生产能力利用率为:BEP Y=BEP Q/Q=F/{(P-V-T)*Q} (<75﹪) 9.决策树法: (1) 画决策树。决策点用方框表示,机会点用圆圈表示。概率枝末稍用Δ表示。(2) 计算各机会点的期望值。计算时从右向左逆向进行。 (3) 修枝选优,作出决策。 重点计算期望值,期望值=∑各状态枝的损益值*其出现概率 10.FD法(强制确定)计算价值系数 第一步计算功能评价系数=功能得分/总得分 第二步计算功能成本系数=功能成本/总成本 第三步计算功能价值系数=功能评价系数/成本系数 第四步计算目标成本=总目标成本*功能评价系数 第五比

电脑常见网络故障排除大全

电脑常见网络故障排除大全 由于网络本身的复杂性,所以许多网络故障的定位和排除都需要大量的知识和丰富的组网经验,以及一系列软件和硬件工具。在本文中,将向大家介绍使用Windows XP内置的工具消灭网络故障的思路与方法。笔者将带领大家从诊断网络故障出现的原因、快速排除轻微故障和彻底解决网络故障的方法三方面入手,帮助大家了解并掌握消除网络故障的方法。 微恙自疗 在网络应用中,常常会遇到一些令人心烦的小毛病,如网络时通时断、只能上QQ却不能打开网页等。通过前面的“诊断”得出结果后,你是愿意等高手来排除故障,还是愿意自己动手使用一些“速效”办法来应急“自疗”呢?一般情况下,你还是想自行排除故障吧。 1.“修复”功能 “修复”功能采用了一种“批处理”的方式,在每次执行该功能时,系统会自动调用内置的近十条网络修复命令,从多个方面帮助用户解决网络故障。在“本地连接”的右键快捷菜单中可以看到它的存在。 这个功能可以让网络重新进行DHCP动态IP的分配、可以刷新地址解析协议和NetBIOS 名称等缓存。这个并不起眼的“修复”功能免去了我们手工输入“ipconfig/renew”、“a rp –d”、“nbtstat–R”、“nbtstat–RR”、“ipconfig/flushdns”等诸多命令的麻烦,能够帮助我们极快地解决很多网络中的轻微故障。 2.暂停服务 在Windows XP中,很多系统服务都与网络有着密切的联系,如果你在进行了一些设置后发现网络出现不稳定的现象,不妨先将相关的服务暂时关闭,看看是否能够解决问题。 如使用IPSec技术可以提高网络的安全性,这是众所周知的。但在某些情况下,IPSec 策略会要求网络通信采用“安全模式”,这个要求可能会使一些网络连接变得不稳定。所以,在设置了IPSec策略后 绮晃榷ㄊ保 环料仍凇霸诵小崩钢惺淙搿皊ervices.msc”命令打开“服务”窗口,将列表中的“IPSEC”服务暂时关闭,看看故障是否可以得到解决。如果停止IPSec服务后问题消失,说明故障是IPSec的部分策略导致的,在故障的大概范围确定下来后,再进行顺藤摸瓜式的故障排除即可,如逐个检查或停用可疑的IPSec策略,观察它

相关文档
最新文档