双霜之君

学习资料收集,转载文章若触犯个人隐私,请联系我删除掉。谢谢。 tdskee@126.com QQ:31605320
posts - 22, comments - 3, trackbacks - 0, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

2011年9月20日

一、获取当前文件的路径
1.   System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName
     获取模块的完整路径,包括文件名。
2.   System.Environment.CurrentDirectory
     获取和设置当前目录(该进程从中启动的目录)的完全限定目录。
3.   System.IO.Directory.GetCurrentDirectory()
     获取应用程序的当前工作目录。这个不一定是程序从中启动的目录啊,有可能程序放在C:\www里,这个函数有可能返回C:\Documents and Settings\ZYB\,或者C:\Program Files\Adobe\,有时不一定返回什么东东,这是任何应用程序最后一次操作过的目录,比如你用Word打开了E:\doc\my.doc这个文件,此时执行这个方法就返回了E:\doc了。
4.  System.AppDomain.CurrentDomain.BaseDirectory
     获取程序的基目录。
5.  System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase
     获取和设置包括该应用程序的目录的名称。
6.  System.Windows.Forms.Application.StartupPath
     获取启动了应用程序的可执行文件的路径。效果和2、5一样。只是5返回的字符串后面多了一个"\"而已
7.  System.Windows.Forms.Application.ExecutablePath
     获取启动了应用程序的可执行文件的路径及文件名,效果和1一样。
二、操作环境变量
利用System.Environment.GetEnvironmentVariable()方法可以很方便地取得系统环境变量,如:
System.Environment.GetEnvironmentVariable("windir")就可以取得windows系统目录的路径。
以下是一些常用的环境变量取值:
System.Environment.GetEnvironmentVariable("windir");
System.Environment.GetEnvironmentVariable("INCLUDE");
System.Environment.GetEnvironmentVariable("TMP");
System.Environment.GetEnvironmentVariable("TEMP");
System.Environment.GetEnvironmentVariable("Path");
最后贴出我进行上面操作获得的变量值,事先说明,本人是编写了一个WinForm程序,项目文件存放于D:\Visual Studio Projects\MyApplication\LifeAssistant,编译后的文件位于D:\Visual Studio Projects\MyApplication\LifeAssistant\bin\Debug,最后的结果如下:
1、 System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName=D:\Visual Studio Projects\MyApplication\LifeAssistant\bin\Debug\LifeAssistant.exe
2、System.Environment.CurrentDirectory=D:\Visual Studio Projects\MyApplication\LifeAssistant\bin\Debug
3、System.IO.Directory.GetCurrentDirectory()=D:\Visual Studio Projects\MyApplication\LifeAssistant\bin\Debug
4、System.AppDomain.CurrentDomain.BaseDirectory=D:\Visual Studio Projects\MyApplication\LifeAssistant\bin\Debug\
5、 System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase=D:\Visual Studio Projects\MyApplication\LifeAssistant\bin\Debug\
6、System.Windows.Forms.Application.StartupPath=D:\Visual Studio Projects\MyApplication\LifeAssistant\bin\Debug
7、 System.Windows.Forms.Application.ExecutablePath=D:\Visual Studio Projects\MyApplication\LifeAssistant\bin\Debug\LifeAssistant.exe

System.Environment.GetEnvironmentVariable("windir")=C:\WINDOWS
System.Environment.GetEnvironmentVariable("INCLUDE")=C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\include\
System.Environment.GetEnvironmentVariable("TMP")=C:\DOCUME~1\zhoufoxcn\LOCALS~1\Temp
System.Environment.GetEnvironmentVariable("TEMP")=C:\DOCUME~1\zhoufoxcn\LOCALS~1\Temp
System.Environment.GetEnvironmentVariable("Path")=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\jdk1.5.0\bin;C:\MySQLServer5.0\bin;C:\Program Files\Symantec\pcAnywhere\;C:\Program Files\Microsoft SQL Server\80\Tools\BINN







对于Windows程序 和Web 应用程序来说,他们运行的路径是不一样的,所以关键是判断当前运行的程序是哪种程序.于是我们可以使用如下的代码
c#获取当前应用程序所在路径 string path = "";
c#获取当前应用程序所在路径           if (System.Environment.CurrentDirectory == AppDomain.CurrentDomain.BaseDirectory)//Windows应用程序则相等
           {
               path = AppDomain.CurrentDomain.BaseDirectory;
           }
c#获取当前应用程序所在路径           else
           {
               path = AppDomain.CurrentDomain.BaseDirectory + "Bin\";
           }
这样如果我们写了一个类库,类库中用到了Assembly.LoadFrom,由于是通用类库,所以可能用到Windows程序中也可能用到Web中,那么用上面的代码就很方便了.

posted @ 2011-09-20 16:13 双霜之君 阅读(4) 评论(0) 编辑

2011年9月8日

在解析C#结构体指针前,必须知道C#结构体是如何定义的。在c#中同样定义该结构体。

C#结构体指针之C#结构体的定义:

[StructLayout(LayoutKind.Sequential)]  
 
public struct VGAStat  
 
{  
 
public int ChannelNum;//通道数量  
 
 
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]  
 
public char[] Version;//版本信息  
 
public uint CPUUsage;//CPU占用  
 
public bool WorkStatusOk; //工作状态  
 
 
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]  
 
public tagCheckArg[] ChannelStatistic;//通道信息  
 

定义完结构体后,就可将接收到的C#结构体指针转换为定义的结构体对象。

 

VGAStat entries = (VGAStat)Marshal.PtrToStructure(iptr, typeof(VGAStat));  
 
//iptr为接收到的非托管的结构体指针。 

反之,也可将结构体赋值后封送到非托管内存。

假如vga为定义后实例化并赋值了的结构体。

IntPtr intptr = Marshal.AllocHGlobal(Marshal.SizeOf(vga));  
 
Marshal.StructureToPtr(vga, intptr, true);  
 
//在此发送intptr指针给目的方  
 
Marshal.FreeHGlobal(intptr);//释放分配的非托管内存。

posted @ 2011-09-08 15:10 双霜之君 阅读(30) 评论(0) 编辑

C++与C#管理内存方式概述

C#最大的一个改进其实就是对内存访问与管理方法的改进。在.NET中内存的管理是全权委托给垃圾回收器,由垃圾回收器来决定何时该释放内存空间。现在普遍采用两种技术来释放程序动态申请的系统内存:首先是以C++为代表的必须以手工方式使应用程序代码完成这些工作,让对象维护引用计数。然后是以.NET以及Java使用的垃圾回收器来完成内存释放工作。

在C++中让应用程序代码负责释放内存是低级、高性能的语言使用技术。这种技术非常有效,且可以让资源在不需要时就释放,因为这种技术可以直接访问内存,所以其最大的缺点是可能导致错误。而且如果程序员的记性不太好的话,也会常常忘记释放内存而导致内存泄漏。

在C#中内存的管理是依靠垃圾回收器,垃圾回收器是一个清理内存的程序。所有采用new关键字申请的动态内存空间都会分配到堆上,当.NET检测到给定过程的堆已经满时,需要清理时,就会调用垃圾回收器。垃圾回收器将采用垃圾回收算法将那些不再被引用的对象所占用的内存空间释放掉。显然由于程序员无法直接控制内存的释放,所开发出的软件性能和效率上一定会受到很大的影响。不过这种影响是随着计算机硬件技术的发展日益缩小的。

究竟是C++中直接由程序员管理内存好,还是像.NET中那样由单独一个程序来统一管理好呢?这个问题是公说公有理,婆说婆有理。但是我相信随着计算机硬件技术不断的发展、存储器空间越来越大、软件的复杂性和软件健壮性要求的不断提高,程序员直接管理内存的方式必将会退出历史舞台。当今的程序员不必再为该如何把程序分块放到容量有限的内存中运行而担心,因为这项任务已经交给了操作系统的虚拟内存来管理。相信不久将来人们也会习惯完全交由诸如垃圾回收器一类的专门程序来管理程序申请的内存空间。

C++中内存的分配方式

在C++中内存的分配方式大致有三种:

(1)    从静态存储区域分配。内存在程序编译的时候已经分配完毕了。并且这块内存中的所有数据在程序的整个运行期间都始终存在的。例如:全局变量,static变量等等。

(2)    在栈上创建。在函数执行期间,无论什么时候到达一个特殊的执行点(左花括号)时,存储单元都可以在栈上被创建。出了执行点(右花括号),这个存储单元自动被释放。这些栈分配运算内置在处理器的指令集中,非常有效,并且不存在失败的危险,但是可供分配的内存容量很有限。

(3)    存储单元也可以从一块称为堆(也被称为自由存储单元)的地方分配,从堆(heap)上分配,亦成为动态分配。在C++中,程序在运行期间可以用malloc或者new申请任意数量的内存,程序员自己掌握释放内存的适当时机(使用free或者delete)。动态内存的生存期间是由程序员决定,使用非常灵活,但也最容易产生问题。

C++用户管理内存常出现的问题

在C++中,我们必须非常小心第三种内存分配方式,因为内存的分配和释放都得由程序员来控制,一不小心就会出错。下面我就分析下在C++中,由于第三种内存分配方式而导致的一些常见的内存泄漏以及一系列的指针问题。

#include<iostream.h>

#include<string.h>

void GetMemory(char *p, int num)

{

p = new char[12];

}

void main()

{

char *str = NULL;

GetMemory(str,100);

strcpy(str,"hello");

}

注意到函数GetMemory(char *p,int num),中的第一个字符型指针参数。写程序的人的本意可能是希望通过此函数为str指针申请内存。但事实上却是str并不会得到所期望得到的内存,str依旧是NULL。因为函数GetMemory(char *p,int num)中所得到的只是指针str的一个副本使得p = str ,他们所存储的内容均是指向同一个内存的地址,但是由于p申请了新的内存,但str指针的值并没被改变,所以函数GetMemory并不能得到任何有用的东西。并且由于每执行一次GetMemory就会泄漏一块内存,因为没有使用free释放内存。

#include<iostream>

using namespace std;

class X

{

public:

      int *ptrArray;

      int size;

      X(int *ptr , int size)

      {

             ptrArray = new int[size];      //(A)

             for(int i=0;i<size;i++)ptrArray[i]=ptr[i];

      }

};

int main()

{

      int arrayData[100]={0};

      X *bill = new X(arrayData,100);  //(B)

      delete bill;                    //(C)

      return 0;

}

例如上面程序中的X类,程序员忘记了编写析构函数来释放在类中所动态申请内存空间。注意到程序第B行代码处,声明了一个X类的对象指针bill。然后在代码第A行处代码动态申请了一段内存空间,并且把数组arrayData中的数值都复制到类中。

接着在代码第C行处,我们删除了指针bill所指向的内存空间。但是类中第A行所申请的内存空间并不会被删除,所以将造成内存泄漏。

#include<iostream.h>

#include<string.h>

void main()

{

char *pointer = new char[100];

strcpy(pointer,"Hello , I am Howells !");

cout<<pointer<<endl;

cout<<"Before call delete function, the address of pointer is : "<<&pointer<<endl;

delete pointer;  //(A)

cout<<"After call delete function, the address of pointer is : "<<&pointer<<endl;

//其间程序非常长,程序员也许忘记了p所指向的内存空间已经释放。

     if(pointer != NULL)

     {

strcpy(pointer, "world");  // (B)

}

}

 

程序运行结果:

Hello , I am Howells !

Before call delete function, the address of pointer is : 0x0013FF7C

After call delete function, the address of pointer is : 0x0013FF7C

Press any key to continue

 

注意到程序中第A行代码,虽然在第A行代码对pointer指针进行了delete操作,但是delete方法只是会释放掉该地址所指向的内存,而pointer指针仍然指向原来所指向的内存地址。通常由于程序比较长,程序员有时可能记不住pointer所指向的内存是否被释放掉了,所以我们会使用一个语句if(pointer != NULL)来进行测试,但是很遗憾的是,pointer并不是NULL,它指向一块不合法的内存单元。第B行的代码在VC++6.0是可行的,也就是说strcpy操作会将一块不属于自己的一块内存单元赋值,这非常可怕会对其他程序造成潜在的危害。

#include<iostream.h>

class A

{

public:

        void Func(void){cout<<"A::func() " <<endl;}

    int I;

};

A *Test(void)

{

      A a;

      return &a;   / /(A)

}

void main()

{

      A *p = NULL;

      p = Test();

      p->Func();

}

在Test函数中我们声明了一个对象a,然后返回对象a的地址。我们知道由于a是临时变量,所以当函数出了执行点(右花括号)时,a被退栈了,但是a所在的存储单元并没有被清除掉。所以仍然可以通过指针p来访问函数Func()。这显然将造成潜在的危险。

C#中内存管理机制

C#中动态内存分配方式

在C#中对内存的管理是依靠.NET 垃圾回收器来完成的,垃圾回收器为高速的分配服务提供了很好的内存使用机制。它可以恢复正在运行中的应用程序需要的内存。垃圾回收器负责清理内存,当.NET检测到给定过程的堆已满时,需要清理时,就需要调用垃圾回收器,下面我将详细介绍.NET的内存分配机制。和C++一样,在.NET中用户所申请的动态内存空间将被分配到堆上,不同的是在.NET上的堆是托管堆。自动内存管理是公共语言运行库在托管执行过程过程中提供的服务之一。公共语言运行库的垃圾回收器为应用程序管理内存的分配和释放。对开发人员而言,这就意味着在开发托管应用程序时不必编写执行内存管理任务的代码。

在C#中大致有三种不同的存储单元:

(1)    Managed Heap:这是动态配置(Dynamic Allocation)的存储单元,由Gargage Collector在执行时自动管理,整个进程将公用一个Managed Heap。

(2)    Call Stack:这是由.NET CLR在执行时自动管理的存储单元,每个Thread都有自己专门的Call Stack。每呼叫一次method,就会使得Call Stack上多一个Record Frame;方法执行完毕之后,此Record Frame会被丢弃。这一点与C++类似。

(3)    Evaluation Stack:这是由.NET CLR在执行时自动管理的存储单元,每个Thread都有自己专门的Evaluation Stack。这个堆栈也叫做堆叠式虚拟机,既程序执行时的资料都是先放在堆叠中,再进行运算。

 

其三种存储单元的物理结构模型如下:

 

.net 内存存储结构

图1-1  

 

下图是托管堆的简化模型。

                          

托管简化模型

 

 

图1-2  

 

在C#中动态分配内存时,.NET是采用如下规则进行内存管理的。

(1)    堆被划分为代,以便只需查找堆的一小部分就能清除大多数垃圾。

(2)    同代中的对象大体上均为同龄。

(3)    代的编号越高,表示堆的这一片区域所包含的对象越老,这些对象就越有可能是稳定的。最老的对象位于最低的地址内,而新的对象则创建在增加的地址内。

(4)    新对象的分配指针标记了内存的已使用(已分配)内存区域和未使用(可用)内存区域之间的边界。

(5)    通过删除死对象并将活对象转移到堆的低地址末尾,堆周期性地进行压缩。这就扩展了在创建新对象的图表底部的未使用区域。

(6)    对象在内存中的顺序仍然是创建它们的顺序,以便于定位。

(7)    在堆中,对象之间永远不会有任何空隙。

(8)    只有某些可用空间是已提交的。需要时,操作系统会从“保留的”地址范围中分配更多的内存。

(9)    所有可进行垃圾回收的对象都分配在一个连续的地址空间范围内。

C#中动态内存回收机制

在C#中大致有三种垃圾回收机制:完全回收、部分回收、使代与写入屏障配合工作。

托管堆模型

 

 

图1-3  

1)      完全回收

在完全回收时,程序将停止执行,并且到托管堆中找到所有的根。这些根以各种形式出现,它们可以是堆栈上的指针或者指向堆中的全局变量。从根开始,我们访问每个对象,并沿途追溯包含在每个被访问对象内的每个对象指针,指针用于标记这些对象。一旦找出了不可达到的对象,我们就需要回收空间以便随后使用;在这里,回收器的目标是要将活的对象向上移动,并清除浪费的空间。在执行过程停止的情况下,回收器可以安全地移动所有这些对象,并修复所有指针,以便所有对象在新的位置上被正确链接。幸存的对象将被提升到下一代的编号(就是说,代的边界得到更新),并且执行过程可以恢复。

2)      部分回收

假设最近执行了一次完全回收,程序继续执行,在发生足够多的分配之后,内存管理系统决定是进行回收的时候了。假设我们非常的幸运,自从上一次回收以后,在我们运行的所有时间里,我们根本没有对任何较老的对象执行写操作,而只是对新分配的(第零代 (gen0))对象执行了写操作。因此,当执行垃圾回收的时候,只需要检查所有的根,如果有任何根指向旧对象,就忽略这些对象。而对于其他根(指向 gen0 的根)我们进行追溯所有指针。一旦我们发现有内部指针指回较老的对象,我们就忽略它。完成以后,我们就访问完gen0中的所有活的对象,但没有访问过任何老的对象(gen1,gen2对象)。接着就对gen0区域进行回收空间处理。

3)      使代与写入屏障配合工作

但事实上,部分回收算法的充分条件是不太可能的,因为总会有一些较老的对象肯定会发生更改。发生这种情况时,.NET使用另外一种辅助的数据结构来配合部分回收算法。card table的数据结构来记住脏对象的位置;牌桌中的每个位代表堆中的一个内存范围,比如说是 128 个字节。程序每次将对象写入某个地址时,写入屏障代码必须计算哪个 128 字节块被写入,然后在牌桌中设置相应的位。

如果我们正在执行一次 gen0 垃圾回收,我们可以使用上面讨论的算法(忽略指向较老代的任何指针),但一旦我们完成该操作,那么我们还必须查找位于牌桌中被标记为已修改的块中的每个对象中的每个对象指针。我们必须像对待根一样对待这些指针。如果我们同样地考虑这些指针,那么我们将准确无误地只回收 gen0 对象。

C#中动态分配内存注意事项

 我们了解了.NET垃圾回收器的工作原理后,就可以针对它来制定出编写高效程序的准则:

(1)     最大程度地减少对象指针的写入次数,尤其是对较老对象的写入。

(2)     减少数据结构中的指针密度。第一,将有很多对象写入。第二,当回收该数据结构的时间到来时,您将使垃圾回收器追溯所有这些指针,如果需要,还要随着对象的到处移动全部更改这些指针。如果您的数据结构的生命周期很长,并且不会有很多更改,那么,当完全回收发生时(在 gen2 级别),回收器只需要访问所有这些指针。但如果您创建的此类结构的生命周期短暂(就是说,作为处理事务的一部分),那么您将支付比正常情况下大出很多的开销。

(3)     如果可以通过只增加少量的程序复杂性,则应该避免过多的动态内存临时分配。如在比较两个字符串的时候,应该避免使用String.Split。因为 String.Split 将创建一个字符串数组,这意味着原来在关键字字符串中的每个关键字都有一个新的字符串对象,再加上该数组也有一个对象。现在,您的两行比较函数就创建了数量非常多的临时对象。垃圾回收器突然因为您而负载大增,甚至使用最智能的回收方案也会有很多垃圾需要清理。最好编写一个根本不需要分配内存的比较函数。

(4)     尽量避免使用析构函数。一个带有析构函数的对象意味着它是需要终结的对象。垃圾回收器第一次遇到应死而未死但仍需要终结的对象时,它必须在这个时候放弃回收该对象的空间的尝试。而是将对象添加到需要终结的对象列表中,而且,回收器随后必须确保对象内的所有指针在终结完成之前仍然继续有效。这基本上等同于说,从回收器的观察角度来看,需要终结的每个对象都像是临时的根对象。回收完成后,终结线程将遍历需要终结的对象列表,并调用终结器。该操作完成时,对象再一次成为死对象,并且将以正常方式被自然回收。

C#与C++内存优缺点对比总结

在对C#以及C++的内存管理机制分析完毕以后,我们可以对比出它们间的优缺点如下:

(1)    C#内存分配比C++更加有效率:因为不需要像传统分配器那样搜索可用的内存块;所有需要发生的操作只是需要移动在可用的和已分配的区域之间的边界。

(2)    C#清理内存机制可以使得程序员无需为管理内存而单独编写在大多数时候都是重复的代码(内存紧缩)。

(3)    在相当出色的程序员编写的程序中没有任何操纵与内存相关的错误代码(通常非常难), 利用C++中程序员直接控制内存方式肯定比C#利用垃圾回收器更加有效。因为程序员通常更加清楚何时回收内存是最佳时刻。

(4)    由于C#中由垃圾回收器回收无用已分配的内存快,所以不会发生由于程序员疏忽而产生的内存泄漏。当然也可能会丢失一些资源,如忘记关闭与数据库的连接等。

posted @ 2011-09-08 09:28 双霜之君 阅读(17) 评论(0) 编辑

2011年9月7日

(原文:http://blog.chinaunix.net/u/18297/showart_296028.html

为了能用上原来的C++代码,只好研究下从C# 中调用DLL
首先必须要有一个声明,使用的是DllImport关键字: 
包含DllImport所在的名字空间 
using System.Runtime.InteropServices; 
public class XXXX{
[DllImport(“MyDLL.dll")] 
public static extern int mySum (int a,int b); 

[DllImport(“MyDLL.dll")] 
public static extern int mySum (int a,int b); 
代码中DllImport关键字作用是告诉编译器入口点在哪里,并将打包函数捆绑在这个类中 
在调用的时候 
在类中的时候 直接   mySum(a,b);就可以了 
在其他类中调用: XXXX. mySum(a,b); 
[DllImport(“MyDLL.dll”)]在申明的时候还可以添加几个属性 
[DllImport(“MyDLL.dll", EntryPoint=" mySum ",CharSet=CharSet.Auto,CallingConvention=CallingC

文件:
PInvoke.rar

大小:
2790KB

下载:
下载

onvention.StdCall) 

EntryPoint: 指定要调用的 DLL 入口点。默认入口点名称是托管方法的名称 。 
CharSet: 控制名称重整和封送 String 参数的方式 (默认是UNICODE) 
CallingConvention指示入口点的函数调用约定(默认WINAPI)(上次报告讲过的) 
SetLastError 指示被调用方在从属性化方法返回之前是否调用 SetLastError Win32 API 函数 (C#中默认false ) 
int 类型 
[DllImport(“MyDLL.dll")] 
//返回个int 类型 
public static extern int mySum (int a1,int b1); 
//DLL中申明 
extern “C” __declspec(dllexport)  int WINAPI mySum(int a2,int b2) 

//a2 b2不能改变a1 b1
//a2=..
//b2=...
return a+b; 

//参数传递int 类型 
public static extern int mySum (ref int a1,ref int b1); 
//DLL中申明 
extern “C” __declspec(dllexport)  int WINAPI mySum(int *a2,int *b2) 

//可以改变 a1, b1
*a2=...
*b2=...
return a+b; 

DLL 需传入char *类型 
[DllImport(“MyDLL.dll")] 
//传入值 
public static extern int mySum (string  astr1,string bstr1); 
//DLL中申明 
extern “C” __declspec(dllexport)  int WINAPI mySum(char * astr2,char * bstr2) 

//改变astr2 bstr 2  ,astr1 bstr1不会被改变
return a+b; 

DLL 需传出char *类型 
[DllImport(“MyDLL.dll")] 
// 传出值
public static extern int mySum (StringBuilder abuf, StringBuilder bbuf ); 
//DLL中申明 
extern “C” __declspec(dllexport)  int WINAPI mySum(char * astr,char * bstr) 

//传出char * 改变astr bstr -->abuf, bbuf可以被改变
return a+b; 

DLL 回调函数 
BOOL EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam) 
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); 

public static bool Report(int hwnd, int lParam) 

Console.Write("Window handle is "); 
Console.WriteLine(hwnd); return true; 


DLL  传递结构   (见代码)
BOOL PtInRect(const RECT *lprc, POINT pt); 
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 XXXX { 
[DllImport("User32.dll")] 
public static extern bool PtInRect(ref  Rect r, Point p); 

DLL 回调函数,传递结构 想看的msdn里面都有专题介绍,看的我都是晕晕的:)
其他参考请搜索:
在C#程序设计中使用Win32类库
C#中调用C++托管Dll
如何在C#中加载自己编写的动态链接库
相关文章:Creating a P/Invoke Library 

posted @ 2011-09-07 23:48 双霜之君 阅读(25) 评论(0) 编辑

2009年10月18日

第35计 谈判计

——如何在冲突和争执中占上风

1.谈判是一场耐心的较量激将法在施展过程中,往往是忍耐的较量,谁先失去耐心,谁便丧失冷静而败下阵去。

在洛克菲勒的轶事中,曾有一位不速之客突然闯入他的办公室,直奔他的写字台,并以拳头猛击台面,大发雷霆:“洛克菲勒,我恨你!我有绝对的理由恨你!”接着那暴客恣意谩骂他达几分钟之久。办公室所有的职员都感到无比气愤,以为洛克菲勒一定会拾起墨水瓶向他掷去,或是吩咐保安员将他赶出去。然而,出乎意料的是,洛克菲勒并没有这样做。他停下手中的活,和善地注视着这一位攻击者,那人愈暴躁,他就显得越和善!

那无理之徒被弄得莫名其妙,他渐渐平息下来。因为一个人发怒时,遭不到反击,他是坚持不了多久的。于是,他咽了一口气。他是准备好了来此与洛克菲勒作斗的,并想好了洛克菲勒要怎样回击他,他再用想好的话去反驳。但是,洛克菲勒就是不开口,所以他也不知如何是好了。

末了,他又在洛克菲勒的桌子上敲了几下,仍然得不到回响,只得索然无味地离去。洛克菲勒呢,就像根本没发生任何事一样,重新拿起笔,继续他的工作。

不理睬他人对自己的无礼攻击,便是给他的最严厉的迎头痛击。成功者每战必胜的原因,便是当对手急不可耐时,他们依然故我,显得相当冷静与沉着。

洛克菲勒用贬低来施激将法,挑衅者用激怒作为手段,可目的过于明显,忍功又不及对手,便只有败走的份了。

还有一例。葛力内在一次会议中对一项决议投了反对票。这个政党的领袖来到他的办公室,指责他是本党的叛徒,企图破坏该党组织。

葛力内正在写稿,见他送来时仍没抬头,好像不知道他就在身旁。来客见葛力内如此冷淡,更是火上加油,越发生气,于是对葛力内辱骂起来。可是,葛力内就是不予理睬,依旧默默地写着他的东西。

来客无可奈何,绕着葛力内的桌子兜了一圈,回到原位,又滔滔不绝地重说了一遍。虽然来客几番重复这套盛气凌人的指责,但葛力内始终没有停下手中的活。直到来客词穷怒息准备离去,葛力内才慢慢地停下手中的笔,抬起头来,轻轻地一笑,丢过去一个得意的眼色,说:“干吗那么着急走啊?回来尽情地发泄吧!”

打仗要挑对手,激将得选莽汉。找那些房高一丈,冷若冰雪的人去激将,说不定象拿破仑碰上梅特涅,周瑜对上孔明,会反道淤将,自讨无趣。

2.谈判之道,一唱一和美国富翁霍华。休斯有一次为了大量采购飞机,与飞机制造商的代表进行谈判。休斯要求在条约上写明他所提出的34项要求,其中至三项要求是没有退让余地的,但这对谈判对手是保密的。对方不同意,双方各不相让,谈判中冲突激烈,硝烟四起,竟发展到把休斯赶出了谈判会场。

后来,休斯派了他的私人代表出来继续同对方谈判。他告诉代理人说,只要争取到34项中的那11项没有退让余地的条款就心满意足了。这位代理人经过了一番谈判之后,争取到其中包括休斯所说的那非得不可的11项在内的几项。

休斯惊奇地问这位代理人,怎样取得如此辉煌的胜利时,代理人回答说:“那简单得很,每当我同对方谈不到一块儿时,我就问对方:”你到底是希望同我解决这个问题,还是要留着这个问题等待霍华。休斯同你解决?‘结果,对方每次都接受了我的要求。“

显然,休斯的面孔及其私人代表的面孔分别看来并无奇异之处,合二为一则产生了奇特的妙用,这便是唱红白脸的奥妙所在。这种策略的做法是,先由白脸出场,他采取咄咄逼人的攻势,提出过分的要求,傲慢无礼,立场僵硬,让对方看了心烦,产生反感。然后,红脸出场,他以温文尔雅的态度、诚恳的表情、合情合理的谈吐对待对方,并巧妙地暗示,如果他不能与对方达成协议而使谈判陷入僵局,那么白脸先生还会再次出场。这番话会给对方心理上造成一种压力。在这种情况下,对方一方面会由于不愿与白脸继续打交道,另一方面会由于红脸的可亲态度而同红脸达成协议。

商业谈判中的白脸可以以各种不同的面目或形式出现,他们可能是人,也可能是某件事情,可能是真的,也可能是假的。估价的人、律师、董事会等都可能会扮演很称职的坏人。政策、原则、各种各样的程序也可以扮演坏人。例如,“我很同情你们,我也愿意考虑你们的立场,可是董事会是不会同意我这么做的。”“我很愿意在这一点上同意你们的观点,可是政策不允许我做出。

不要以为对人笑脸相迎,给人面子,一团和气,就能赢得谈判。一味地唱红脸,会使人觉得你有求于他,有巴结之嫌。越是这样,对方越会强硬、傲慢,在谈判中占尽上风。在必要的时候,有必要给对方施加点颜色,用一些白脸手段刺激一下对方。当然,所谓刺激,并不是激怒或伤害对方,而是为了引起对方对某种事实的注意,更加重视自己,同时也提醒对方不要过分抬高自己的价码。

刺激对方的方法是多种多样的,但作用和效应都在于能够引起对方的忧虑不安。在商务谈判中,许多场外行动都可能引起双方的注意力,直接影响谈判桌上的形势,对商谈者起到刺激作用。例如:在商谈期间,还在继续和另外的商家接洽;在谈判过程中,突然有其他客商找上门来,暂时中断了正在进行的会谈,抱怨商谈时间拖得太久,自己的日程活动安排得很紧;直接和其他客商交换资料,等等,这些是双方都非常敏感的举动,可以暗示给对方很多东西,使对方有紧迫感。

当然,这种场外刺激的方法不能乱用,因它们很具冒险性,容易伤害对方的感情和诚意。另一方面,切忌小题大作,故作声势,结果“假”客商赶走了真正的合作者,鸡飞蛋打一场空。所以,刺激对方必须巧妙,至少要表现自己的诚心诚意,也就是说要告诉对方:“‘我并不是嫁不出去的女儿,而是确实中甚于你,就看你领情不领情了。”这样的刺激才会促进双方的理解与合作。

在商务交际中,刺激对方的途径并不限于言语,一些事实会更有说服力。但是,如果你想继续合作的话,同样的道理,应该通过一些环节和细节进行暗示,不要过分伤害对方,例如,如果在价格上争执不下,你可以拿出新设计来要求对方,或者对原来订的货物提出意见,说明双方都要面对现实,才能有好的合作前景。

唱白脸的一个变种是澳双簧。双安策略能使谈判人员从骑虎难下的状态中得到解脱,在谈判中我们常常可以听到一方谈判人员互相之间进行这样的对话:“老李,你今天上午怎么那么别扭?我本来想我们应该可以同意……”“我认为他们有点道理。如果我们同意……”在这里,同一方的谈判人员表面上好像采取了对方的立场,并向同伴建议做出让步。可是这种情况多半是在表演双簧:事先决定让一个人采取强硬态度,到了适当的时候,再由同伴出面提出折衷方案;可是那位强硬分子却硬是作出一种姿态,表示老大的不愿意。最后,在同伴的反复劝说下,才勉强同意。当然,对方得到了这个好不容易才到手的让步后,自然会对那个好人做出相应的回报。

在商业谈判中,还可以把双簧表演倒过来做。例如,你可以在不太重要的问题上先做一些让步。然后,在关系重大问题上你的同伴出面讲话了。他会对你说:“你今天上午表演得很慷慨,但在这一点上,你不能再作让步了。我们已经让得太多了。”这时候,你把脸转向对方,为难地说:“我现在已经无能为力了,一切都只好由你们决定了。”

从我们的描述中看起来,这种双簧表演似乎是很明显的,骗不过一个有经验的谈判者手。但是在长时间紧张谈判的压力下,识破这种策略也是不容易的。特别是唱双簧的人配合默契,表演自然的情况下,当然,对方也有可能会起疑心,但他不能完全肯定那是表演。他可能会想:“他们的这些话也许是真的,我可以趁这个机会想办法分化他们。”

3,点一点对手的穴道任何一个谈判者,不仅应该清醒地意识到在议判中自己究竟要得到什么,而且还要明确自己究竟能够给对方什么。因为谈判是彼此利益、需要的交换。自己的要求自己最清楚,而对方的要求则难以把握。因此,就一场谈判来讲,最重要的或许就是发现对手的需要,有的时候甚至是要以有意识的行动创造对手的需要。有一个讨债专业户,一次受雇去追讨一家企业所欠的贷款,他从那家工厂门卫口中知道了该厂厂长另有新欢。他就到厂长家中与其妻子闲聊,掌握了该厂长偷税、行贿等不法私情。然后,他再去找厂长,以此要扶对方,他如愿地追缴到了欠款,也拿到了事先约定的佣金。他的前任没有成功,因为他们只有自身的需要而没有可能满足对方的需要。简单地说,对手不怕他。他则以其狡诈的手段(这属于谈判谋略的范畴)发现或者说创造了对手的需要,于是形成了交换的可能和必要。这就是谈判中的“空手道”的秘密。

在谈判中要能随机应变,抓住对方的弱点给予打击,有气功中点穴手段的奇妙效果。有些弱点是事先已经被我方掌握的,而有些弱点则是在对招之中对方暴露出来的,我方要随时发现把柄。两雄争辩,是双方理与气的较量,理是气的内核,气是理的锋芒,理直就气壮,理曲则气馁;但在一定条件下,气盛也能使理壮三分。出色的谈判家常常着意寻找对手的有关弱点,狠狠一台,譬如釜底抽薪,使对方的锐气顷刻消释,束手就范。所谓有关的弱点,是指对手论点上的错误、论据上的缺失、论证上的偏颇或其本身性格、行为、感情上的各种局限。诸葛亮舌战群儒的故事,是很值得欲施把柄的谈判人员研习的。

诸葛亮初到江东,作为弱国的使者,而且独自一人,看上去势单力孤。江东的那些怕硬欺软的谋士们,倚仗着坐在家中,人多势众,一个个盛气凌人。诸葛亮决心先打掉他们的气焰,所以出手凌厉,制人要害,像张昭这样的江东首席谋士,凭他的嚣张气势,也不过勉强与诸葛亮周旋了三个回合。他突出的弱点是主张降曹,投降是既无能又无耻的表现。诸葛亮瞅准这一点,在历数刘备一方怎样仁义爱民、艰苦抗击曹操之后,话锋一转:“盖国家大计,社稷安危,是有主谋。非比夸辩之徒,应誉欺人;坐议交谈,无人可及,临机应变,百无一能。——诚为天下笑耳!”这样就一下子点到了张昭的痛处,使他再也不能开口。

张昭以下的虞翻、步鹰、萍踪、陆绩、严峻、程德枢之流,都是上来一个回合就翻身落马的。如薛练与陆绩出于贬低刘备,拾高了曹操的身份,这就犯了当时士大夫阶层中的舆论大忌。诸葛亮一把抓住这点,斥责他们一个是“无父无君”,一个是“小儿之见”,说得两个人“满面羞衡”,先后“语塞”。严峻与程德枢完全是迂腐儒生,一个问诸葛亮“适为儒者所笑”,诸葛亮尖锐地指出:“寻章摘句,世之腐儒也,何能兴邦立事”“小人之德……笔下虽有千言,胸中实无一策。”甚至屈身变节,更为可悲。准确有力地击中对方的弱点,使对方垂头丧气,理屈词穷。

在唇枪舌剑中,对手总有说漏嘴的时候,这正是穷追猛打的好机会。这种办法用以对付傲气十足的对手较易奏效,因为做者一丢丑便像斗败的公鸡一样,会会头丧气,沮丧不已。因此傲者比谦虚的人更容易打败。

英国驻日公使巴克斯是个傲气十足的人,他在同日本外务大臣寺岛宗常和陆军大臣西乡南州打交道时,常常表现出不屑一顾的神态,还不时地嘲讽两人。但是每当他碰到棘手的事情时,总喜欢说“等我和法国公使谈了之后再回答吧!”寺岛宗常和西乡南州商量决定抓住这句话攻击一下巴克斯这种做气十足的行为。一天,西乡南州故意向巴克斯:“我很冒昧地问你一件事,英国到底是不是法国的属国呢?”

巴克斯听后又挺起胸膛傲慢无礼地回答说:“你这种说法太荒唐了。如果你是日本陆军大臣的话,那么完全应该知道英国不是法国的属国,英国是世界最强大的立宪君主国,甚至也不能和德意志共和国相提并论!”

西乡南州冷静地说:“我以前也认为英国是个强大的独立国,现在我却不这样认为了。”

巴克斯愤怒地质问道:“为什么?”

西乡南州从容地微笑着说:“其实也没有什么特别的事,只是因为每当我们代表政府和你谈论到国际上的问题时,你总是说等你和法国公使讨论后再回答。如果英国是个独立国的话,那么为啥要看法国的脸色行事呢?这么看来,英国不是法国的附属国又是什么呢?”

傲气十足的巴克斯被问得哑口无言。从此后他们互相讨论问题时,巴克斯再也不敢做气十足了。

西乡南州抓住巴克斯语言上的弱点展开攻势取得令人满意的效果。毫无疑义,任何人都不可能是十全十美的,难免有自己的弱点,而傲气者而一旦被别人抓住弱点进行攻击,也就瓦解了其傲气的资本。

4.退一步,进两步有时候谈判中的一方,不太敢用退出来要挟对方,生怕谈崩了弄得鸡飞蛋打。所以,谈判老手都会不择手段地掌握对手的真正意图,摸清了底牌,便掌握了谈判的主动权。这时再以什么方式取胜,已是技术问题了。以退要挟达到进的目的,便是常用的一种。

巴拿马运河最早不是由美国开凿。19世纪末,一家法国公司跟哥伦比亚签订了合同,打算在哥伦比亚的巴拿马省境内开一条连通大西洋和太平洋的运河。主持运河工程的总工程师就是因开凿苏伊士运河而闻名世界的法国人雷赛布,他自以为这一工程不在话下,然而巴拿马环境与苏伊土有很大的不同,工程进度很慢,资金开始短缺,于是公司陷入了窘境。

美国早在1880年就想开一条连贯两大洋的运河。由于法国先下手与哥伦比亚签订了条约,美国十分懊悔。

在这种形势下,法国公司的代理人布里略访问美国,向美国政府兜售巴拿马运河公司,要价一亿美元。美国早已对运河公司垂涎三尺,知道法国拟出售公司更是欣喜若狂。然而,美国却故作姿态,罗斯福指使美国海峡运河委员会提出报告,证明在尼加拉瓜开运河省钱。报告指出,在尼加拉瓜开运河的全部费用不到2亿美元。在巴拿马运河的直接费用虽然只有1亿多,但另外要付出一笔收买法国公司的费用,这样,开巴拿马运河的全部支出将达2亿5千多万美元。

布里略看到这个报告后大吃一惊。如果美国不开巴拿马运河,法国不是一分钱也收不回了吗?于是他马上游说,表明法国公司愿意削价,只要4000万美元就行了。通过这一方法,美国就少花了800万美元。

罗斯福又用同一计策来压哥伦比亚政府。他指使国会通过一个法案,规定美国如果能在适当时期内同哥伦比亚政府达成协议,将选择巴拿马开运河,否则,美国将选择尼加拉瓜。

这样一来,哥伦比亚也坐不住了,驻华盛顿大使马上找美国国务卿海约翰协商,签订了一项卖国条约,同意以100万美元的代价长期租给美国一条两岸各宽3公里的运河区,美国每年另外付租金10万元。

“欲进先退”,罗斯福成功地运用了这种谋略,最后,美国只用了很少的代价,就攫取了巴拿马运河的开凿和使用权。

可是在许多情况下,对方的底牌很难摸清楚,可以用分析和推断来把把对方的脉。如果对手实在是打持久战,那么冒点风险以退出恐吓对方,也值得一试。也许他比你更不愿意谈判破裂,真是如此,你即使表示退出也仍然有澳旅的余地。

1920年,新生的苏维埃俄国还处于国际帝国主义的包围和封锁中。为了冲破封锁包围,俄共非常希望与西方国家发展经济贸易关系。当时的意大利政府出于经济原因,在国内工业界的压力下也愿意同苏俄进行经贸联系。意大利外交大臣卡洛。斯弗茨几次在报纸上发表声明,表示他的政府打算恢复同苏俄的贸易关系并准备在罗马接待苏俄经济代表团。俄共迅速地抓住这一机会,宣布组成以苏俄早期杰出的外交家沃罗夫斯基为首的经济代表团赴罗马。

但是,这时意大利国内的政治形势急剧变化,反共反苏的法西斯势力迅速抬头,他们在全国各地大搞暴力活动,猖狂反对共.产.党.人。俄国经济代表团成员也经常受到骚扰、跟踪、搜查,俄国派来的外交信使也遭到扣押。在压力下,意大利执政的乔利蒂政府不得不拒绝承认俄国经济代表团的外交地位,但又急于同俄国签订贸易协定,缓解国内实业界呼声,并加强自己在最近的议会选举后变得十分不稳的地位,争取更多议员的支持和拥护。1921年5月,乔利蒂政府向逗留在罗马的俄国经济代表团建议立即签订贸易协定。

苏俄政府认真深入地分析了意大利政府的心态,决定采用以退为进的策略。这下,意大利政府慌了神。三天之后,外交大臣斯弗茨再次邀见沃罗夫斯基,这次他格外客气。

又过了三天,沃罗夫斯基收到了意大利政府的公函。公函中说:“我们两国在经济上的接近是令人感兴趣的…我们乐于自今日起给予你们希望得到的外交特权。”

需求常常是双向的,你有求于对方,对方也有求于你。洞悉了这一点后,就应该利用对手这种弱势,在谈判中采取以退为进的方略,要挟对手,迫使对手就范,做出妥协和让步。

从以上的两个例子可以看出,对对方意图的了解至关重要。但有一点也很清楚,无论是美国人还是苏联人都不愿谈判破裂,他们只是采取要挟的策略达到自己的目的。所以,如果在谈判中你的对手要挟你时切莫上当,或者你知道了对方怕你撤出谈判时,你也可以装着马上就停止谈判的样子,让对方接受对你有利的条件。这其实也是谈判双方信息、信心和意志力的综合较量。

更多请看:http://hi.baidu.com/tdskee

posted @ 2009-10-18 12:02 双霜之君 阅读(55) 评论(0) 编辑

第17计 恐吓计

——如何利用人性的弱点控制他人

人人都知道“撑死胆大的,饿死胆小的”。可大多数人都无法忍受恐惧,战胜怯意。这便是恐吓得以奏效的心理基础。

恐吓多用于在较量的开端处,为自己建立心理优势,另外也可打草惊蛇,引出对手的弱点。

要吓住人必须想方设法比常人多长几个胆子,比对手更为气势汹汹。以对阵为例有几个办法可以使人更容易产生勇气:①找出蔑视对手的理由;②大声说话,造出声势;③以眼光作剑逼迫对手;④身体摆出必胜的架势;⑤背光站立。

恐吓有几个常见的战术不可不知:一、善用法律这把“尚方宝剑”压人,是当代法制社会中不同于以往的重要方法。

二、在捧场、恭维中夹杂“恐”字常常奏效,而有时则非此不可。

三、先发制人,先声夺人,先下手为强,努力创造先机进而致胜。

四、以平淡、低调使自己更显得坚定。这是较为圆熟的方法。

五、以无言对恶语,用寂静生恐怖,对对手不理不眯。这是最为上乘的恐吓。

另外应强调:恐吓是很难驾驭的技术,不知对手深浅极容易弄巧成拙,所以风险很大。

1.长自己胆气,灭对手威风东汉时的廉范是战国时赵国名将廉颇的后代,曾经做过云中(治所在今内蒙古托克托旗)太守。当时正值匈奴大规模入侵,报警的烽火天天不断。按照旧例,敌人来犯如超过五千人,就可以传信给邻郡。廉范手下的官吏想要传布檄文,请求援助。廉范没有同意,而是亲自率领仅有的少数部队,前往边境抵御来犯的匈奴骑兵。

匈奴人多势盛,廉范的兵力比不过匈奴,正巧日落西山,廉范命令战士们每人将两根火炬交叉捆在一起,点燃其中的三个头,另一头拿在手中,分散在营地和营地周围列队,顿时火点如同满天的繁星,很是壮观。匈奴军队远远望见汉军营地扩大,火烛甚多,以为来了许多援军,大为惊恐。廉范对部下说:“现在我们的谋略是,乘黑夜用火去突袭匈奴,使他们不了解我们究竟有多少人,这样他们肯定会吓得魂飞胆丧,我们就可以把他们全部歼灭的。”

清晨敌人将要撤退的时候,廉范命令部队早起吃了饭,然后直奔匈奴营地,正赶上天刮起大风。廉范命令十几人拿着战鼓埋伏在匈奴营房后面,同他们约定,一见大火燃烧,要一边击鼓,一边呼叫。其他人都拿着兵器和弓箭,埋伏在敌营大门的两边,廉范于是顺风放火,前后埋伏的人击鼓的击鼓,呐喊的呐喊。匈奴军队摔不及防,乱作一团,慌乱之中自相践踏,死亡上千。汉军又趁势追杀,新敌数百名,取得了重大胜利。从此以后,匈奴再也不敢侵犯云中了。

恐吓的前提之一便是气势汹汹的样子要装得像模像样。只有对方产生了怯意,才能将对方唬住。一个胆小自卑的人无法使用恐吓,弄不好还会害了自己。以小充大,以弱充强说到底是勇气的较量,意志的搏斗。

下面介绍一些壮胆的办法,以便在关键时刻不畏恐吓或敢于恐吓对方:①在胆怯或自卑时,找出对手的弱点,先在心里将对手打倒是一种方法。

在感到对方的威吓时,就去找出对方可笑的地方,当你想着他的可笑时,压迫感、胆怯就会全都消失了。假如在你目所能及的范围内挑不出对手的毛病,那就想象一下他在其他场合的卑微,这样也会把对方从权威或力量的宝座上硬拉下来。比如,分公司里为所欲为的董事长,到了总公司的董事会上,可能只是本座的小角色罢了;他回到家里,也可能是一个在太太面前拍不起头来的惧内先生;在娱乐场合,又可能只是一个被孩子欺负而无还手之力的父亲。

假如只看见对手的优点,往往容易高信对手,而产生难以应付的意识,可只要想到对方和我们一样,不过一个人而已,再想象一下,他的卑微与毛病,你就不会再胆怯或自卑了。

②尽可能大声说话,武装自己的心理,制造压倒对方的气势。

宏大而响亮的声音,可以给对手有信心的印象,自己也能借此产生坚强的信心,进而获得意料不到的效果。在辩论或争吵中,有人会不由自主地提高自己的噪音,以期盖过对手,这就是对“嗓音可以增强信心”的本能利用。

中国古代战场上双方对垒时,都会擂起战鼓,声音越高,士气就越旺盛,士兵斗志越强。鲁国与齐国打仗,就先让齐国擂鼓,开始时,鼓声惊天动地,齐军士气高昂。鲁军按兵不动。渐渐地,齐军战鼓声越来越小,士气也就渐渐低留下去,这时各军猛括战鼓,一鼓作气,将齐军打败。小男孩子夜里走过墓地时,愉快而大声地吹口哨,也为的是壮胆,通常他就这样克服了行经墓地的恐惧,因为他“吹起了”自己的勇气。

你的声音就是你无生的武器,只要你表现出勇气十足,你的勇气就来了。表现勇敢则勇气来,往后退缩则恐惧来。

③用你的眼睛盯视对方眼手等某一身体部位,给对方以压迫感。比如恋爱中的一对闹矛盾时,为了证明自己观点的正确,用言语已无法奏效时,明智的人们就会改用双眼集中于他的手都或眼睛,让自己的恼怒和要求通过这种注视传导给对方,“此时无声胜有声”。这样可以给对方一种心理上的压迫感,并可避免语言冲突时双方不冷静,易冲动的心理状态。

其实,在任何竞争中,这种“一点突破”的战术是颇为有效的。所谓“一点突破”就是聚集一切力量,朝向对手最弱的部位猛力攻击。

比如,在对话中,你的眼睛不妨直视对方身体的某一部位。这样不但不会受到对方制造出来的压迫感的威胁,而且,还能令对方不得不转移注意力于被盯视的那一个部位。换句话说,你的视线不仅可使对方的态度失去平衡,并能分散对方的意识。此外,你也能造成一种迫使对方心慌意义的局面,借此收到处境转化的效果。

④相待中,身体要摆好架势,震慑对手。

在双方对垒时,人的形体动作也是增强信心的一种武器。销国大作家居格提夫的散文《麻雀》写了这样一件小事:而后,一只小麻雀从树上掉了下来,飞不动了,猎狗看见了,便跑过去。这时,一只老麻雀从树上飞下来,挡住了小麻雀,并冲着猎狗张开了全身的羽毛,恶狠狠地盯着猎狗,猎狗竟然呆住了。麻雀其实也是在本能中利用自己的羽毛、动作、眼光这一切天生的武器向猎狗示威,驱除自己的恐惧。

体育比赛中,运动员有时为了增强战胜对手的信心,会有意识地昂首挺胸,做出不畏一切的样子。谈判中,这也能产生震慑对手的效果。

⑤占据背光位置,可产生威慑效果。

站在反光线的位置上,不但可给予对方有目眩的物理效果,同时也能产生各种不同的心理影响。首先,在现场上站立的形象,正如同摄影一样,让对方无法认清自己的表情。相反地,对方的形象却被阳光照遍了各个角落,因而暴露了身体的每一部分,仅凭这一点,就会使劲敌惶恐不安了。何况,置光于后的形象,也能与光融合为一体。使对方对自己产生比实物更大的印象,由于这种后光照射的状态,方能使自己在精神上压倒对方。

只要考虑到这种原理,那么,即使自己不站在受光的位置上,也不要站在感受不到光线的暗阴上。这样,在对方似乎更为强大时,利用光线的效果,就能从心理上战胜对方,确保优越的地位。

2.捧中无恐,功亏一篑“厚黑大师”李宗吾对捧与恐的关系颇有见解,他在论述旧官场时说:“恐吓的意思,是及物动词。这个字的道理很精深,我不妨多说几句。官这种东西,该是何等宝贵,能轻易给人吗?有人把择字做到十二万分,还不能生效,这就是缺少恐字的工夫。凡是当权的那些大人物,都有软处,只要找到他的要害,轻轻点一下,他就会大吃一惊,立刻把官儿送来。学者须知,恐字与捧字,是互相结合着用的。善恐者,捧之中有恐,旁观的人看他在上司面前说的话,句句是阿议逢迎,其实在暗地击中要害,上司听了,汗流泱背。善捧者,恐之中有律,旁观的人看他傲骨模棱,句句话责备上司,其实听的人满心欢喜,骨节都酥软了。这就是所谓的‘心领神会,在于各人’,‘高明的木匠能教人按规矩做,却不能告诉你技巧’。这就要求求官的人细心体会,最要紧的是用恐字的时候,要有分寸,如果用过度了,大官们恼羞成怒,作起对来,岂不就与求官的宗旨大相违背?这又何苦如此呢?不到无可奈何的时候,恐字不能轻易使用。”

一味地恭维、捧场会被人欺负,在日常生活中是一样的。比如男性在纠缠女性时,一般说来总有或多或少的顾虑。假如他是厂长,就自然担心事情败露,会影响到他的声誉。问题是男人一时情绪冲动,早将事情后果置之度外。因此,聪明的女子此时便必须将此后果向对方明言,给他一个威胁,从而促使他收回原意。有位女子其丈夫是海员,长期漂泊在外,孤独和寂寞陪她度日。白天上班还好说,一到晚上便焦躁不安。为了消磨时光,她报考了夜大。第一次上课,发现丈夫中学时的一位同学也坐在教室里。此同学与丈夫相处不错,因此跟他自然亲近起来。没料到这位同学却暗暗打起她主意来。女子觉察到这位同学的不良动机。她十分严肃地对他说:“俗话说,‘朋友之妻不可欺’。你是我丈夫的朋友,他平时对你那么好,要是我告诉我丈夫,不知他会对你怎么样啊?”同学一听,大惊失色:“你可……可千万别这样!”

历史上的“杯酒释兵权”,是典型的先择后恐的成功之作。赵匡胤从后周手中抢过是位之后,带领手下将士南征北战,基本上统一了中原一带。后又平灭了南唐,江山一统,天下太平,渐渐觉得那些战时曾流血卖命的把兄弟们无用起来。他们不但与自己分享荣华富贵,而且个个手握兵权,若一旦有哪个嫌自己官位不过病,发难道反,局面就难收拾了。但要向众弟兄下手,又怕天下人气愤。且每位弟兄手下都有一大批亲信,若向众弟兄下手,激起他们手下叛乱,自己的皇位也是坐不稳。怎么办呢?想来想去,他想到了酒。以酒掩脸,让众弟兄交出兵权。大家若照办,这事就解决了。若有人发难反对,就用醉酒疯话掩过去。

第二天,他召来手握兵权的把兄弟们,饮酒谈笑,开怀痛饮,直喝到红日西沉,个个眼亮脸红。赵匡胤看差不多了,于是讲起往事,最后叹一口气说:“若永远生活在那段日子里多好!白天厮杀,夜晚倒头就睡。哪像现在这样,夜夜睡觉不得安宁广众兄弟一听,关心地问:”怎么睡不稳?“赵匡胤说:”这不明摆着吗,咱们是把兄弟,我这个位子谁也该坐,而又有谁不想坐呢?“大家面面相觑,感到事态严重起来,想到刘邦得天下后逐个杀功臣的历史旧事,一个个胆战心惊,跪在地上说:”不敢“。赵匡胤看预期效果达到,顺势穷追下去,说:”你们虽然不敢,可难保手下人不这么想。一旦黄施加在你们身上,就由不得你们了。“大家一听,明白赵匡胤已在猜忌大伙了。吓得在地上叩头不敢起身;求赵匡胤想个办法。赵匡胤说:”人生苦短,大家跟我苦了半辈子,不如多领点钱,回家过个太平日子,那多幸福。“大家忙点头说:”照办“。

第二天,旧日的那些功臣们一个个请求告老还乡,交出兵权,领到一批钱,回家过富翁生活去了。

只择不恐会让对方自觉有恃无恐,答不答应要看他高不高兴,主动权在对方手中;而捧中加恐,主动权在我们手里,捧字只用做台阶,让对方不失面子,实质上他是非顺从不行的。

3.先出声,可夺人有一次,美国洛杉矶的华裔商人陈东在香港繁荣集团购买了一批景泰蓝,言明一半付现金,一半付一个月期票。交易那天,陈东却不出面,派来儿子陈小东。一个月后,期票到期了,银行却退了票,几经联系,陈东一推再推,后来索性不接电话了。繁荣集团这才知道上了圈套。集团老板陈玉书说:“除非他永远缩在美国,不在香港做生意,只要他来香港,我一定通他把钱交出来。”陈玉书广布眼线,终于有一天,陈东来到了香港。陈玉书马上派人同他联系,并以鸟兽景泰蓝优惠售价相诱,将陈东请到公司。陈玉书大脚一踹,房门大开,大喝一声:“陈东,你上当了!”陈东这时脸色大变,仿佛吴牛喘月,但立在对面。

“你既然来了,就让我处置你吧。”陈玉书伸出手掌问他:“我的钱呢?”“我没欠你的钱,是我儿子欠的。”“不是你在电话里答应,我怎么会让你儿子取货?”“儿子欠债,要老子还钱,这不符合美国法律!”“这里是香港!你今天要能走出这个门,我就不姓陈!”

“我们这些人是讲道理的,对不讲理的人我们总有办法处理。你知道我是什么人?”不等对方回答,陈玉书大声说:“我从小在印尼就是流氓!”

俗话说:“软的怕硬的,硬的怕横的,横的怕不要命的。”这时,陈东冷汗直流,用手摸摸胸口,又忙掏药,看样子心脏有点不妥。陈玉书对陈东说:“我们是讲人道主义的,我今天要的是你还钱,否则你别想走出这个门。”陈东知道抵赖是无用的,诡计也施不上了,只得乖乖地打电话给一个珠宝商人,叫他开支票,估计他在那儿存了钱。

陈玉书在恐吓时先发制人,占据了心理优势,在对垒中取得先机,因此顺利获胜。俗语说:“先下手为强”,便是此理。

很多人一听说要与强敌对阵,内心大都会立生恐慌,或者一见面就想临阵脱逃,其实,这种做法等于是自甘失败。如果你能先发制人,就可减轻这种心理压迫。

原世界重级拳王穆罕默德。阿里,每次比赛前都要为自己写一首赞美诗,宣誓一定要击倒对方,然后再上场。此举为他赢得了“吹牛大王”的称号,其实这正是阿里特有的心理战略。通过宣布自己的比赛目标,在比赛前就在心理上先给对方重重的一击,使自己占据优势。

在人际交往中,虽说不是刀枪相见,可这存在一种心理优势由谁取得的问题,下面介绍几种先声夺人的具体做法:①一开始便宣布最低目标以压制对方。

对于初次见面的人,如果能给予先发制人的一击,就可以在心理上压倒对方。例如,一开始便宣布此次见面的最低目标,如果你说:“今天你只要记得我的名字就行了”,或者说:“无论如何,请给我五分钟的时间”,那么,对方往往会接受你的暗示,感到自己至少有记住你的名字或给你五分钟讲话机会的义务,使以后的话题朝着对你有利的方向发展。

②争论中自己先提问题可占先机。

在唇枪舌战中,你不要老等着对手发问后,你去机械地被动应答。而首先就反问对方,逼着对方按照你的思路去行进,这样起码从心理上你就首先赢得了胜利。

③让对方先表现礼貌而你可故意忽视礼仪。

礼仪是为了那些社会地位方面存在着高低之分的人们能顺利进行交流而制定的。例如,从礼节上来说,地位较低的人应该先向地位高的一方打招呼,至于进餐,则由地位较高的人先动筷子等。由此可见,礼仪其实是清楚地反映出了人与人之间的序列关系。因此,如果你来取序列较高者的行动,例如,鞠躬时让对方先鞠躬,进餐时则要先动筷子,这样便能占据优势。有时候,故意忽视礼仪也是一种很重要的心理战术。

④比对方提前到达约定地点。当自己比约定的时间晚到时,难免会觉得很不好意思;倘若发现对方还没到,心情就舒畅,同时也觉得很从容,看见对手的时候,心理上总有一种优越感。

⑤不要主动道歉,以免处于劣势。

常常听人说,在国外遇到车祸时,绝不要先说“对不起”。因为即使责任胡明在对方,欧美人也会认为先道歉的一方有责任。而且,此时先开口致歉的一方肯定会处于劣势。因为“对不起”这句话会决定心理上的次序。

总之,一旦先声夺人取得成功,占据了心理优势,对方便有可能产生恐慌或失意,恐吓便可大功告成。接下来把握住主动权的问题了。

4.恐怖故事要低声讲述“眼睛像嘴巴那么会说话”,这句话不仅指说话的内容,同时也包括说话的声调。激动时,任何人声音都会升高,心情不好对,声音会低沉。流氓在威胁人时,故意把声音压低,为的是人对方表示:“在这种情况,我还是很镇静的。”

常听人说开会时声音大的人占上风,但想说服人的时候,大声反而引起反效果。因为越是大观大叫,对方听起来越觉得那是强迫式的,即使明知对方有道理,也很容易兴起反感的感情。因此如果想说服别人的话,小声说话才是上策。对方也比较容易打开心房,另外,小声说话,对方为了怕听错,也会探出身子,洗耳恭听。

某先生有一个很小的事情,但颇启发人:一位滥用权威的警员为了停车超过一小时而给了我一张罚款单。他的态度并不十分果断,于是我走向他。他正站在十字路口。

“警官”,我低声地说,“我打算着手调查这个城镇里的停车问题。你可知道从这儿到‘一小时停车’标志有多远?”

“我猜大低变远吧”,他回答着,并将罚款单拿走了。

低声讲话容易使人信服,因为它能显示说话人坚定的信心,而且没有虚张声势之嫌疑。

当别人侮辱作,刘脸红了脸,别像个自信的巨人般高视阔步。假使你觉得他想欺骗你,你就把有力的证据授在后头。你的麻烦愈是大,你所表现出的力量就要愈是小。只有懦夫才又威胁又大叫的。

交际中常有这样的情况:声音最大、吵得最凶,往往是有十分害怕的痛点的,选出其痛点为突破口,则可一举击败对方。让税务人员接到举报去查封一家偷税的烟店。当税务人员一开口询问有关的情况,老板就大声地指责税务人员偷听偏信,并大骂同行嫉妒他、诬陷他,那劲头仿佛是税务人员得罪了他,被他数落似的。但这位税务人员从他丰富的工作经验中得知:越是这种人越有问题。于是不与他正面冲突,只平淡地丢下一句:“你先别吵,过几天我们带几个人来查查再做结论。”烟商所了这话越发模不到底。虽然强作欢颜送客,但客人已明显看出其伯查的痛处。那税务人员嘱咐他的住在烟店对面的一位正立的朋友暗中注视他家的动静,一有情况立即打电话通知。当天晚上烟商用一辆平板车装了二十多箱香烟准备转移,波及时赶来的税务人员当场查获。如果税务人员和这烟筒刀对刀、枪对枪地干起来,最终只能落入烟商的团会,既不能完成任务,也不能制取对方。

在这场对抗中,税务人员使用了鼓山露民打草惊蛇的恐吓,而成功的关键就是在打草时不图张扬,只此一句,却起到了真正的惊吓作用。如果太过吓唬,对方不但不会受该,而且会以为你在吓他、唬他,于是在心理上会产生对你的怀疑和防范。

更多请看:http://hi.baidu.com/tdskee

posted @ 2009-10-18 11:59 双霜之君 阅读(40) 评论(0) 编辑

2009年9月19日

摘要: ^A 缩放/点阵字体 ^A(可缩放/点阵字体)命令用于内置的True Type字体。可缩放字体(也可以认为是平滑矢量字体)能够以点为单位来对横向、纵向进行扩展。点阵字体由点阵象素组成,通常高度高度大于宽度。 内置的的缩放字体(A0=CG Triumvirate Bold Condensed)默认为不旋转,15点高,12点宽。打印机将从^A命令得到字体的旋转方向、宽度、高度等参数。^A命令的格式: ^Af,o,h,w^A= 缩放/点阵字体 f= 字体名 默认值:0(CG Triumvirate Bold Condensed) 其他值:A-Z,0-9(打印机的任何字体,包括下载字体,EP...阅读全文

posted @ 2009-09-19 10:26 双霜之君 阅读(1597) 评论(0) 编辑

2009年9月18日

摘要: 探究需求管理的本质------什么才是需求管理(作者:万成编译 2001年03月13日 10:03)  本文旨在探究需求管理的本质,需求管理所要涉及的任务在文中将适时提及,以阐释"需求管理之需求(requirements for requirements)"的涵义。☆概要  需求管理恰如裁缝的量体裁衣,它直接关系到最终产品的成型。仅从字面出发,如果一个产品满足了客户需求,那它无疑就是成...阅读全文

posted @ 2009-09-18 20:29 双霜之君 阅读(120) 评论(0) 编辑

摘要: 软件需求说明书模板1引言... 21.1编写目的... 21.2背景... 21.3定义... 21.4参考资料... 22任务概述... 22.1目标... 22.2用户的特点... 32.3假定和约束... 33需求规定... 33.1对功能的规定... 33.2对性能的规定... 33.2.1精度... 33.2.2时间特性要求... 33.2.3灵活性... 43.3输人输出要求... 4...阅读全文

posted @ 2009-09-18 20:28 双霜之君 阅读(875) 评论(0) 编辑

摘要: 软件和需求的实践林星 (iamlinx@21cn.com)2001 年 10 月来自《IBM DeveloperWorks》 在这个关于软件工程的新专栏里,作者将结合理论知识,实践案例,优秀的工具介绍,经典文章导读,告诉您软件工程中最重要的一个过程――需求过程各方各面的知识。通过阅读,您将了解到,需求的知识体系,需求的过程能力,相关的软件工程知识,在实践中如何做好需求分析。...阅读全文

posted @ 2009-09-18 20:24 双霜之君 阅读(160) 评论(0) 编辑