问题是这样的,我们开发了一个软件需要用到GDI+,有没有办法在程序启动的时候能够判断出系统是否支持,如果不支持的话禁止一些功能?
因为软件不大而且大部分用户的系统都支持,不希望把那个dll放在一起

解决方案 »

  1.   

    我觉得应该从windows的version判断,高于某个版本的一定都可以的
      

  2.   

    有一方法,供参考
    HMODULE hMod = LoadLibrary("gdiplus.dll");
    if (hMod)
    {
               //有此DLL
            }
            else
            {
               //没有此DLL 
            }
      

  3.   

    可能我没有说清楚,当我把GDI+编译进去之后,在没有GDI+的系统上运行程序就会出现找不到这个DLL,如果我要判断的话也势必要在这个之前,但是好像系统的这个判断是在最前面,郁闷
      

  4.   

    这样的话,放在另一个exe中来判断啊,如果有,就启动后面程序,如果没有,就不启动等
      

  5.   

    要么动态加载GDI+,看是否加载成功来判断...
      

  6.   

    这个应该是可以通过非正常手段实现的,比如HOOK技术或者更改PE等等,当然我也不能肯定,仅供参考,楼主可以去搜搜
      

  7.   

    另外一种解决方法是把你用到的GDI+函数都动态导入,这就不需要链接GDI+了
      

  8.   

    发布的时候把gdiplus.dll带在程序目录下gdiplus.dll的版本很多,  一般都是自己带。  看QQ就知道
      

  9.   


    动态加载,LoadLibrary(),如果找不到,返回句柄无效,就是不支持
      

  10.   


    //GDI+是为C/C++开发者提供的一个基于类的应用程序编程接口(API),这是SDK的中文翻译版本。WORD格式。
    //目标
    //Microsoft Windows GDI+是为C/C++开发者提供的一个基于类的应用程序编程接口(API)。它使得程序可以同时在视频显示器和打印机上使用图形和格式化文本。基于Microsoft Win32的应用程序不能直接访问图形硬件,而是通过GDI+来协调设备驱动和程序动作的交互。GDI+同样支持Microsoft Win64。//适用范围
    //GDI适用于所有的Window应用程序。GDI+是包含于Windows XP和Windows Server 2003中的一项新技术。运行于Microsoft Windows NT 4.0 SP6、Windows 2000、Windows 98 和 Windows Me操作系统的应用程序在分发的时候需要包含GDI+。//适用读者
    //GDI+ C++ 基类接口是为C/C++开发者所设计。需要精通Windows图形用户接口和消息驱动机制。//运行环境
    //Gdiplus.dll包含在Windows XP中。某些特定的类和方法可能需要特定操作系统的支持,请参阅文档中相应的类和方法。GDI+可以在Windows NT 4.0 SP6、 Windows 2000、 Windows 98以及 Windows Me操作系统中重新分发部署。下载最新的可重新分发安装包,参见:http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdkredist.htm 
    //注意:如果您将GDI+分发到低版本系统平台或者该平台本身不包含该版本的GDI+,则将Gdiplus.dll安装到您的应用程序目录下。这样将它放到了您自己的地址空间下,但是您应该使用/BASE连接器选项重构基地址,避免地址空间冲突。
    看上面的说明:gdi+再厉害也只是C++的库,只要这个库在gdi+就能运行(Win32 可能不包括CE) 所以楼主不用去考虑什么支持不支持的 只要你程序自己带上了gdi+的支持就行了。 所以 建议程序打包的时候把GDI+的DLL lib 等打进安装包就可以了。
      

  11.   

    gdiplus的版本也有好几个,即使找到了也不代表它支持你的软件。
    还是自己带上吧。
      

  12.   

    直接在你的软件里面判断。当你的软件某一个目录下面有 gdiplus.dll 时就说明系统支持 GDI+,没有就表示不支持。不根据系统来判断。小广告,技术交流群:6259765
    讨论范围不限:分布式系统构架,服务器集群,客户端开发,图形图像。
      

  13.   

    只有自己找了,你也可以安装的时候带上这个gdiplus.dll 不就行了?
      

  14.   

    1.建议打包上匹配的gdiplus.dll
    2.如果不想打包,想根据系统环境来判断是否支持,可以采用下面的方法
    BOOL IsSupportGDIPlus()
    {
        HMODULE hMod = ::LoadLibrary(_T("gdiplus.dll"));
        if (NULL != hMod)
        {
            ::FreeLibrary(hMod);
        }    return (NULL != hMod);
    }
    但是这个检测要在最前面执行,也就是调用任何GID+函数的最前面,确保检测时未曾调过GDI+函数。
    3.在工程设置中设置gdiplus.dll为延迟调用VS05/08中,工程设置->配置属性->链接器->输入->延迟加载的DLL这样你的程序就可以实现你的要求了。