因为业务的需要,在程序中需要判断windows的版本类型,如果是win98及一下的操作系统,则须调用user.exe中的GetFreeSystemResources函数,取得win98下gdi和user的资源占用情况。
大致代码如下:
============================
//首先判断os类型,如果为win98,则执行下面代码
typedef int (* LPGETFREERESOURCE)(int);
LPGETFREERESOURCE lpGetFreeResource;
HINSTANCE hRsrc;
hRsrc = LoadLibrary("user.exe");
if(hRsrc == NULL)
{
MessageBox(NULL,"Can't load user.exe","dcbassrv Error",MB_OK|MB_ICONSTOP);
return;
}
lpGetFreeResource = (LPGETFREERESOURCE)GetProcAddress(hRsrc,"GetFreeSystemResources");
if(lpGetFreeResource == NULL)
{
FreeLibrary(hRsrc);
MessageBox(NULL,"Can't load GetFreeSystem","dcbassrv  Error",MB_OK|MB_ICONSTOP);
return;
}
m_iFreeResource[0] = lpGetFreeResource(0);
m_iFreeResource[1] = lpGetFreeResource(1);
m_iFreeResource[2] = lpGetFreeResource(2);
b = FreeLibrary(hRsrc);
========================
可查阅msdn,上说不能在32位程序中直接装入16位dll,
因此请高手告诉如何才能访问user.exe内的GetFreeSystemResources函数,
在下不胜感激。

解决方案 »

  1.   

    LoadLibrary("user.exe");
    返回的的错误代码是31
      

  2.   


    http://support.microsoft.com/kb/q155763/
      

  3.   

    如果是95/98可以使用如下的Thunk实现。具体做法:
    1。利用Thunk生成两个DLL:一个32位的,一个16位的,其中32位的函数通过Thunk下移到对应的16位函数中;
    2。在此新建的含有Thunk功能的16位DLL中加载你已有的16位DLL,并对其引出函数做包装——这些包装正是32位DLL中下移下来的函数。
    3。应用程序首先加载32位DLL,由于使用了Thunk机制,Windows会为你加载16位的DLL。这个16位的DLL又加载了你原来的DLL(这次windows不会帮你,你要自己写代码加载)。当应用程序调用32位DLL中的包装函数时,由Windows负责将其转化为对16位DLL的调用,你自己再在16位的DLL中调用原来的16位DLL中的函数,完成一次完整的“包装调用”。
    关于Thunk的细节,可在MSDN中搜索标题:HOWTO: Call 16-bit Code from 32-bit Code on Windows95,里面讲得很详细。
      

  4.   

    正在看msdn文档,试试如果可以就结帖
    不过,还想问问各位,是否还有更简单一点的方法调用16位函数
      

  5.   

    thunk -t thk 16to32.thk -o 16to32.asm 
    http://www.driverdevelop.com/article/znsoft_16-32-thunk.mht参考下列Microsoft Knowledge Base的文章:How to Debug Flat Thunks 
    链接地址:http://support.microsoft.com/default.aspx?scid=kb;EN-US;133722
      

  6.   

    用Rsrc32.dll
    http://www.csdn.com.cn/program/5089.htm