在MFC中,有一个函数AfxGetInstanceHandle可以得到,但现在不用MFC,而console型的程序中,main函数传入参数中hInstance值不可见.
有什么Windows API函数或者方法吗?

解决方案 »

  1.   

    HINSTANCE hInstance = GetModuleHandle(NULL);
      

  2.   

    GWL_HINSTANCE
    Retrieves a handle to the application instance.
    使用方法:
    HINSTANCE hInstance = GetWindowLong (hwnd, GWL_HINSTANCE);
    其中,hwnd为主窗口的句柄。
      

  3.   

    连虚拟内存跟实际内存都没搞清楚。固定的 0x40... 得到有用吗?到其他进程里SendMessage()对这个句柄根本没戏
      

  4.   

    1、我不知道为什么要用到实际内存
    2、我没有搞清楚实际内存对 SendMessage() 有什么帮助
    还请楼上不吝赐教。如果能让我弄明白而且正确,我情愿把我所有的可用分都给你。
      

  5.   

    delphihero(阿蒙(C++)) 的说法是有道理的:GetModuleHandle:This function must be used carefully in a multithreaded application. There is no guarantee that the module handle remains valid between the time this function returns the handle and the time it is used. 
    For example, a thread retrieves a module handle, but before it uses the handle, a second thread frees the module. If the system loads another module, it could reuse the module handle that was recently freed. Therefore, first thread would have a handle to a module different than the one intended.上文来自《MSDN》
      

  6.   

    GetMoudleHandle() 回来的句柄对其他进程是没用的,它记录的是加载到当前进程的位置,如果第一个dll这个就是0x100... ,这都是虚拟内存里面地。你在另一个进程中是无法访问这个地址的,另一个进程中0x100...是那个进程的第一个dll位置。
    而一般跟其他进程通信,都是FindWindow().....那个句柄才能反映另一个进程窗口情况。才是可以SendMessage()的对象。
    你的可用分有多少阿。我的1w6,注册4年了。再给我也没意见可以先改变控制台名字( 默认的含路径不好输入:( )然后FindWindow
    SetConsoleTitle("hello");
    HWND hwnd = FindWindow(NULL,"hello");
    SendMessage(hwnd,WM_CLOSE,0,0);//关闭控制台,也可以在其他程序里面给这个句柄发消息
    system("PAUSE");  //这个语句不会被执行
    这个就是那个控制台程序窗口句柄。绝对不是0x40...
    楼主意思也是找个窗口句柄吧
      

  7.   

    得到模块句柄的用 I_Love_CPP(我爱C++) ,
    由hwnd转过去:HINSTANCE hInstance = (HINSTANCE) ::GetWindowLongPtr(hwnd,GWL_HINSTANCE);
    日,我有没说我的是 application instance。 前面已经有了这个函数了,我不过补充个参数你的那个函数搞错了还拽个屁。csdn开了我就注册了。
    强烈鄙视不懂乱写的人。
      

  8.   

    楼上的小兄弟,从你说话的口气可以看出你的岁数还不大。和别人说话最好客气点。仔细看一下搂主的要求好不好?搂主说,他在 MFC 里可以用 AfxGetInstanceHandle() 函数,而在 console 程序里面也想得到同样的东西,者说的显然是模块句柄,我实在不明白你为什么非要和窗口什么的扯上关系呢?还有,在 csdn 上注册了多少年的事情是你先提出的,我只不过回了你一下,又没有要和你比什么的意思,而且在 csdn 上注册的早晚并不能代表一个人的水平,你说对不对?不敢多说,我写程序 11 年了,在 Windows 上编程也有 8 年了,在我身边承蒙大家看得起,也都还认为我的技术不差。我不会相信对 Windows 你比我多了解什么的。最后再奉劝一句,如果你在现实生活中也这样和别人交流,实在是不好。
      

  9.   

    比较敏感,口气冲了不好意思。对于有窗口的程序下面都可以得到句柄地址:    
        HINSTANCE ht= AfxGetInstanceHandle() ;
        CString str;
        str.Format("%d",ht);
        AfxMessageBox(str);
        HMODULE HMD = GetModuleHandle(NULL);
        str.Format("%d",HMD);
        AfxMessageBox(str);
        HWND hwnd = AfxGetMainWnd()->m_hWnd;
        str.Format("%d",hwnd);
        AfxMessageBox(str);
        long lg = GetWindowLong(hwnd,GWL_HINSTANCE);
        str.Format("%d",lg);
        AfxMessageBox(str);
    其实都是400000为之开始,+ 一个固定偏移地址(大概是dos显示win32应用的)。
    控制台程序就是400000开始的。它的句柄应该是控制台句柄。(我这么觉得,不认同我也没办法)
    调用 GetModuleHandle()和GetWindowLong()是两个完全不同结果。
    也没什么好争得,我说的控制台应用句柄。你的是程序模块加载地址。
    或许控制台就没有应用程序句柄的说法。
    别生气,俺不要你的可用分,只跟你比较一下嘛。至于技术能力在下不敢比较,早对这方面心灰意冷。女怕嫁错郎,男怕入错行。