Articles of winapi

PATH_NOT_FOUND和NAME_NOT_FOUND有什么区别

在Win32层,我们经常遇到ERROR_PATH_NOT_FOUND , ERROR_NAME_NOT_FOUND 。 WinAPI(eg CreateFileW, RemoveDirectoryW)何时WinAPI(eg CreateFileW, RemoveDirectoryW)返回这些值? 有什么区别? 如果我写一个文件系统驱动程序,我什么时候设置STATUS_OBJECT_PATH_NOT_FOUND或者STATUS_OBJECT_NAME_NOT_FOUND ? 你如何确定? 我很困惑。 有谁能清楚解释? 还是有任何文件解释这个? 我找不到他们。 提前致谢。

将unicodestring存储在ini文件中时是否会出现与编码相关的问题?

目前已经有关于unicode和ini文件的问题,但是其中很多是针对特定领域的。 所以我不确定这个答案是否适用于一般情况。 动机 :我想使用ini文件来存储简单的数据,如一些数字和一些string。 string由用户提供(通过GUIinput)。 该软件可以运行在世界任何地方,任何语言都可以使用。 这些文件也可以在用户之间共享(这样他们可以写在一个系统上,在另一个系统上阅读等等)。 我认为在使用GetPrivateProfileStringW和WritePrivateProfileStringW (我的目标系统> = Windows XP)时,ini文件中的unicode应该没有问题。 但后来我偶然发现了这个问题的答案。 引用: WritePrivateProfileStringW函数将使用传统系统编码(例如,日文系统上的Shift-JIS)编写INI文件,因为它是传统的支持function。 如果你想有一个完全支持Unicode的INI文件,你将需要使用一个外部库。 我现在不确定 – 我必须担心吗? 或者我可以继续使用ini文件? 编辑: 似乎避免随机编码的关键可能是准备一个包含BOM的空文件,然后使用这个文件。 有没有人(正面/负面)的经验呢?

如何创build一个更低的完整性级别(IL)的新stream程?

看起来,从Windows Vista开始,具有较低完整性级别(IL)的进程不能将消息发送到具有较高完整性级别的进程。 这从安全的angular度来看是有道理的,但是它打破了我们的一些进程间通信。 我们有遗留的应用程序(进程A),不幸的是必须以提升的“pipe理员”权限运行(通过将其快捷方式设置为始终以pipe理员身份运行来完成)。 有时它需要实例化一个单独的应用程序(过程B)。 因此,进程Binheritance了与进程A相同的提升权限(和IL)。存在这个问题。 可能还有其他独立的进程B实例没有提升权限,所有这些进程B实例都需要能够相互发送消息。 如果进程B的一个实例提升,另一个则不提升,这显然会失败。 我知道我们可以使用ChangeWindowMessageFilter API方法在UIPI消息filter中打开漏洞,但这看起来不是理想的解决scheme。 相反,我更愿意让Process A产生具有减less权限的进程B,特别是为了能够与其他进程B实例进行通信。 我想默认情况下,其他进程B实例运行在“中”IL,所以我想过程A产生与这个相同的IL过程B实例。 我的search引导我到CreateProcessAsUser和CreateRestrictedToken API方法,但尽pipe有这个文档,所有的令牌和安全描述符等方面仍然让我感到困惑。 我也遇到了一些线程( 在winapi中运行一个具有最低权限的进程, 在Windows上运行C ++的权限 ),但是我找不到任何有代码的好例子。 任何人都可以提供一些简单但“正确”的代码,这将帮助我使用适当的Windows IL产卵subprocess? 具体来说,我想要一个如何采取现有的过程A令牌的例子,并将其转换,使其具有减less的权限(我敢肯定,我可以找出其余的)。 我还不清楚在修改之前是否需要复制进程的标记。

如何为Win32应用程序启用工具栏的现代外观?

最近我开始学习基于Win32 API的GUI编程。 当我将工具栏控件(从comctl32.lib )添加到我的简单应用程序时,我发现它看起来很平坦,而菜单栏有更多“Windows 7友好”的3D外观和感觉(顶部为白色光晕,上部为垂直灰度梯度)。 差异使它看起来有线。 但是,我发现许多其他应用程序对于菜单栏和工具栏都有一致的外观和感觉。 例如。 记事本++和记事本2 。 我读过一些官方文档,并尝试了解决scheme,例如视觉样式概述 , 启用视觉样式 ,但是,它只启用平面button样式(与旧的Win98实体button样式相比)。 这与我在第一张照片中得到的风格没有任何区别。 我试图阅读Notepad ++的源代码。 findToolBar.cpp,并相应地对我的代码进行了一些更改,但没有任何更改。 我想我是在代码库中输了。 这里是我调用InitCommonControlsEx和创buildToolBar的代码。 // in WinMain INITCOMMONCONTROLSEX icce; icce.dwSize = sizeof(INITCOMMONCONTROLSEX); icce.dwICC = ICC_BAR_CLASSES | ICC_COOL_CLASSES | ICC_USEREX_CLASSES; InitCommonControlsEx(&icce); // called in WM_CREATE handler, hwnd is the handle of the main window VOID BuildToolBar(HWND hwnd) { HWND hTool; […]

如何在窗口上设置HICON(多种尺寸的.ICO)?

我想定义一个Win32窗口的应用程序图标,例如,通过使用GCL_HICON调用GCL_HICON并传递一个图标的句柄(参见MSDN上的SetClassLong函数 )。 这很好,但我还没有想出我应该如何加载一个图标(从一个ICO文件),以保持所有可用的大小(例如16×16,32×32,48×48和全尺寸的PNG图标)。 当我通过LoadImage将图标文件LoadImage到内存中以获取HICON ,我必须指定我想要的大小(请参阅我对相关问题的回复 )。 我的ICO文件包含一个小尺寸的图像,它应该被用作窗口图标(标题栏的左上angular),并且devise得非常清晰,但是也应该在Alt-Tab对话框中显示更大的变体,但是… 加载16×16图标在标题栏中显示正确的图标,但是 – 当然 – 当我按Alt-Tab时,它是一个难看的拉伸版本。 而在任务栏中显示的那个也不是很漂亮。 加载48×48图标时,按Alt-Tab时会显示一个漂亮的图标,但标题栏中显示的图标是模糊的,因为它是48×48图标的缩小版本。 有什么办法告诉Windows,我的Windows有一个多尺寸的图标? 有没有我错过的一些明显的API?

当使用Winsock读取所有信息时,结束“recv()”循环

我在winsock的recv()循环中遇到问题。 我试图在iResult == 0时终止循环,但是,循环仅在套接字closures时结束。 它似乎挂在最后recv()哪里iResult将等于0.所以任何想法如何有效地终止循环? 我的最终目标(无论是否iResult == 0,也许我是这样做的错误方式)是当所有发送的信息被读取时停止循环。 这是循环。 do { iResult = recv(socket, recvbuf, BUFLEN-1, 0); if(iResult > 0){ // Null byte 🙂 // Remove that garbage >:( recvbuf[iResult] = '\0'; printf("Recvbuf: %s\n\n\niResult: %d\n",recvbuf,iResult); continue; // working properly } else if(iResult == 0) // Connection closed properly break; else { printf("ERROR! %ld",WSAGetLastError()); break; } […]

在.net中针对域控制器validation用户凭据

在.NET应用程序中,我试图通过用户名和密码对Windows用户,本地用户以及域用户进行身份validation。 我已经试过这个解决scheme 。 我的代码来获取PrincipalContext看起来如下: protected static PrincipalContext TryCreatePrincipalContext(String domain) { var computerDomain = TryGetComputerDomain(); if (String.IsNullOrEmpty(domain) && String.IsNullOrEmpty(computerDomain)) return new PrincipalContext(ContextType.Machine); else if (String.IsNullOrEmpty(domain)) return new PrincipalContext(ContextType.Domain, computerDomain); else return new PrincipalContext(ContextType.Domain, domain); } protected static String TryGetComputerDomain() { try { var domain = Domain.GetComputerDomain(); return domain.Name; } catch { return null; } } 这对于本地Windows用户以及ActiveDirectory中的远程用户都可以正常工作。 […]

1百万行的ListView

我有一个SysListView32 ,应该可能主持数百万行,三列文本A,B,C每个<256个字符。 比方说,B列有许多重复(例如:列A是文件名,列B是path,每行是文件系统的文件),并且只有100k个不同的值(而不是几百万)。 是否有可能避免在ListView GUI元素的列B的内容的RAM中重复? 我们可以只用指向数组元素的指针来填充一个ListView (取自列B的不同值的100k-元素数组),而不是重复的数据? 如何修改这个使它工作? LV_ITEM item; item.mask = LVIF_TEXT; item.pszText = "Hello"; … ListView_SetItem(hList, &item);

C ++,win32 API:如何创build一个HTML渲染窗口,以便您的应用程序将从JS调用获得callback?

我需要的很简单:我们有一个控制台应用程序项目。 我们希望有这样一个函数,它将打开一个只有html(基于默认系统)的html + js渲染窗口,可以读取一些默认的html + jsstring(表单string或const char *)的简单窗口。 我们希望有我们自己的apijoin默认的js api,这样当JS调用一些our.function(argument); 我们将有我们的C ++应用程序performe函数和例如cout参数。 如何在Windows上创build这样的东西?

OpenThread()返回NULL Win32

我觉得这个问题有一个明显的答案,但这个问题一直困扰着我。 我在C ++中有一些遗留代码,当它尝试调用OpenThread()时会中断。 我在Visual C ++ 2008 Express Edition中运行它。 程序首先获取调用线程的ThreadID,并尝试打开它,如下所示: ThreadId threadId = IsThreaded()? thread_id::: GetCurrentThreadId(); HANDLE threadHandle = OpenThread(THREAD_ALL_ACCESS,FALSE,threadId); 现在这是我不明白的:如果线程ID是当前线程的ID,是不是已经打开? 那可能是为什么它返回NULL? 对于任何反馈,我们都表示感谢。