SystemParametersInfo调用失败的问题

从 PUDN 上下载了读取 EXCEL 文件的程序,刚开始编译不通过,主要是因为循环变量定义位置的问题,好解决!

但编译通过后,运行程序即出现错误:

ExcelAccess.exe 中的 0x1026ed6a (msvcr90d.dll) 处未处理的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突

出错的代码如下:

 1 LPLOGFONT CPPToolTip::GetSystemToolTipFont() const
 2 {
 3     static LOGFONT LogFont;
 4     NONCLIENTMETRICS ncm;
 5     ZeroMemory(&ncm,sizeof(NONCLIENTMETRICS));
 6     ncm.cbSize = sizeof(NONCLIENTMETRICS);
 7     if (0 == SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0))
 8     {
 9         TRACE("Error of SystemParametersInfo is %d/r/n",GetLastError());
10         return FALSE;
11     }
12     memcpy(&LogFont, &(ncm.lfStatusFont), sizeof(LOGFONT));
13     return &LogFont;
14 }  

SystemParametersInfo()函数运行失败,返回零;GetLastError()同样也返回零。

修改方法:

ncm.cbSize = sizeof(NONCLIENTMETRICS) - sizeof(ncm.iPaddedBorderWidth);

原因:

由于从 Vista 和 Windows Server 2008 开始,NONCLIENTMETRICS 在最后增加了 iPaddedBorderWidth 字段。

如果程序打算同时支持 vista 和 XP,Windows 2000, Windows Server 2003,那么应该先调用 GetVersionEx() 检测Windows版本,然后决定是否需要减去 sizeof (ncms.iPaddedBorderWidth) 。

时间: 2024-10-14 04:58:38

SystemParametersInfo调用失败的问题的相关文章

Sql Server远程调用失败

这篇文章主要为大家介绍了SQL server服务显示远程过程调用失败的解决方法,还为大家提供了解决SQL SERVER 2008 R2配置管理器出现"远程过程调用失败"(0x800706be)错误提示的方案,感兴趣的小伙伴们可以参考一下 刚刚打开SQL Server 2008,想要新建一个数据库,却发现出现了一个问题,这个问题由于之前没有遇到过,所以下面整理解决SQL server服务远程调用失败的几个方法,供大家参考,具体内容如下 先看看出现的问题: 出现上面这个错误的原因可能是由于

解决安装不同版本office后造成的PIA COM组件调用失败

症状:TF400422, TF400423, TF400424: Failed to open in Microsoft Excel (Project, Outlook): Unable to cast COM object of type 'Microsoft.Office.Interop.Excel(Project, Outlook).ApplicationClass' to interface type 'Microsoft.Office.Interop.Excel._Applicatio

DllRegisterServer的调用失败的问题解决方法

今天安装歌词转换器的时候需要安装COMDLG32.OCX,在注册ActiveX控件时出错了, 错误提示是COMDLG32.OCX.ocx已加载,但是DllRegisterServer调用失败.其实在日常的工作中,用regsvr32 命令注册dll.ocx等时,这种模块已加载,但DllRegisterServer的调用失败的问题很常见,下面和大家分享一下我的经验,希望能够帮到大家. 方法/步骤 这种提示一般都是因为我们的权限不够造成的. 我的操作系统是win8 64位的,所有我就用我的系统和大家分

vs自动生成的WebService配置文件在部署到IIs6后,服务调用失败的解决方法

近日,在项目中需要引用java发布的WebService,添加服务引用后,调用一切正常. 配置如下: <system.serviceModel> <bindings> <basicHttpBinding> <binding name="SecurityServiceImplServiceSoapBinding" maxBufferPoolSize="2147483647" maxReceivedMessageSize=&qu

"最大工作进程数"导致的WCF调用失败

WCF服务寄宿在IIS中,当设置其"最大工作进程数"为2时,经常会出现服务无法被成功调用,具体异常信息如下: Type:System.ServiceModel.Security.MessageSecurityException Message:从另一方收到未进行安全处理或安全处理不正确的错误.有关错误代码和详细信息,请参见内部 FaultException. HelpLink: Source:System.ServiceModel.Internals TargetSite:TAsync

IE报错:模块&quot;scrrun.dll&quot;已加载,但对DllRegisterServer的调用失败,错误代码为0x80004005

在我的win10系统上打开某内部网页登录的时候弹出'模块"scrrun.dll"已加载,但对DllRegisterServer的调用失败,错误代码为0x80004005'报错信息,搞了好久都没有 搞好,最后百度找到注册文件“clock.zip”运行其中的批处理文件后成功登陆. 注册文件链接:http://files.cnblogs.com/files/xxlu/clock.zip 注意:在注册的时候要将批处理文件run.bat中clock.ocx组件的地址改为本地绝对地址,博主提供的r

SQL Sever 2008配置工具中过程调用失败解决方法

刚刚装了VS2013,然后打开数据库时,无论如何也连不上.打开数据库配置,出现如下界面: 上网搜了,试了很多方法,像什么把windows\system32\wbem下的framedyn.dll复制到system32目录下,还有照一个老外说的,下什么更新补丁,都没用!! 想重装SQL2008,结果运行安装程序,变成了英文版(以前装显示的是中文的),而且安装根目录选不了!巨想死! 万念俱灰下,打开360,卸载了一个叫"Microsoft SQL Server 2012LocalDB",重新

模块已加载,但对dllregisterServer的调用失败

在注册dll或者ocx的时候, 经常会遇到这么一个问题: 模块  已加载,但对dllregisterServer的调用失败,错误代码为0x8004***** 网上有网友回复说需要在管理员的模式下进行注册:本人测试过, 会出现如下问题: 模块  加载失败.请确保该二进制存储在指定的路径中,或者调试它以检查该二进制或相关的 .dll文件是否有问题.  找不到指定的模块 还是没有能解决问题,经过长时间尝试,终于用以下方式的第一点解决了问题 本人亲测:至于另外的方式,我没有测试过. 以下是解决win7运

[MS-SQL] SQL Server 2008 组态管理工具出现:远端进程调用失败 0x800706be 解决方法

[MS-SQL] SQL Server 2008 管理工具出现"远端进程调用失败 0x800706be"解决方法 因为项目需求电脑装的 SQL Server 是使用 SQL Server 2008 Express 版本,而自从安装完 VS 2012 之后原本正常的 SQL Server 竟然立马坏了,又因为时间总是太少事情总是太多,所以一直拖到最近才来找问题,不要问我那我工作怎办!因为至少 SQL 连远端的部分还是正常的! 问题由来 因为项目需求电脑装的 SQL Server 是使用