Windows 新启动计算机上网络文件上的GetPrivateProfileInt

Windows 新启动计算机上网络文件上的GetPrivateProfileInt,windows,winapi,Windows,Winapi,在深入搜索为什么某些工作站在早上启动时不会执行特定操作(…)之后,我发现GetPrivateProfileInt只返回默认值,并且在网络子系统尚未激活时,不必费心将GetLastError设置为非零(例如,因为DHCP客户端仍在尝试获取要使用的IP地址。) 这听起来有人熟悉吗?有人知道我应该/可以做些什么吗 现在,我将使用备用默认值进行更正,并在获取默认值时暂停一点。我将检查该文件是否存在,并休眠几秒钟,直到该文件存在。在多次尝试后,使用默认值或采取适当的操作。GetPrivateProfile

在深入搜索为什么某些工作站在早上启动时不会执行特定操作(…)之后,我发现
GetPrivateProfileInt
只返回默认值,并且在网络子系统尚未激活时,不必费心将
GetLastError
设置为非零(例如,因为DHCP客户端仍在尝试获取要使用的IP地址。)

这听起来有人熟悉吗?有人知道我应该/可以做些什么吗


现在,我将使用备用默认值进行更正,并在获取默认值时暂停一点。

我将检查该文件是否存在,并休眠几秒钟,直到该文件存在。在多次尝试后,使用默认值或采取适当的操作。

GetPrivateProfileInt()是一个看似无辜的Windows API函数,其背后有大量代码。有大量appcompat代码,旨在允许Win3程序在现代版本的Windows上运行。其副作用之一是速度非常慢,上次分析它时大约需要50毫秒

看起来你发现了一个缺陷。据我所知,它实际上可能是由appcompat行为设计的。模仿18年前这个API的工作方式。我当然不知道这是否准确


你能做的最好的事情就是停止使用它。一个可能的解决办法是先打开文件,让你的程序阻塞,直到服务启动并运行。

我完全同意,我也发现这是检索设置最慢的方法之一;你可以切换到boost::program_选项,或者,如果你只使用INI的一部分,也可以切换到文件,您可以使用GetPrivateProfileSection检索所有数据并在内存中对其进行解析(一旦我编写了一个类,该类包含所有这些混乱,并提供了轻松读取/写入任何类型的通用方法())。顺便说一句,它之所以这么慢,也是因为每次调用时都要重新分析整个文件。@matteo:我不这么认为。解析文本很便宜,只需几微秒,而不是几毫秒。ini文件有多大或参数在文件中的位置也无关紧要。文件数据也应该从文件系统缓存中出来。但这似乎并不重要如果发生这种情况,它似乎再次击中磁盘以打开文件。奇怪。