本帖最后由 shipeiyuan 于 2012-05-02 22:04:38 编辑

解决方案 »

  1.   

    #define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name
    DECLARE_HANDLE(HINSTANCE);  
    这个只能说明HINSTANCE和指针一样大,具体是什么这里看不出来,像HWND,HDC都如此定义,但它们根本不是指针HINSTANCE是exe映像的虚拟地址,HINSTANCE用于区分进程实例仅限于没有隔离进程地址空间的16位windows,现在的windows每个进程有自己的地址空间,两个进程的同一个地址可以是不同的东西,此时HINSTANCE不再具有唯一标识运行中的实例的功能
      

  2.   

    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE PreInstance,LPSTR lpCmdLine,int nCmdShow)
    {
      hInstance=HINSTANCE(100); //加入这条语句,让程序每次运行是,hInstance值都相等。
    你这就算是hInstance唯一标志了实例也没用,就像这个函数起不到交换的作用void swap(int a,int b)
    {
    int c=a;
    a=b,b=c;
    }
      

  3.   

    楼主看的那本书是孙鑫的《深入理解VC++》吧,上面尽是错误的概念。hInstance不是什么句柄,而是进程的虚拟地址的基地址,多个进程的虚拟地址空间的基地址完全可能是重叠的,不重叠的是16位实模式,就是windows3.1等16位windows系统下的样子。现在32位系统都使用保护模式,不怕多个进程地址值一样。
      

  4.   

    HINSTANCE的值就是这个程序的起始地址。
      

  5.   

    我也在看这个HINSTANCE,不知道到底有什么用,呵呵