Articles of winapi

将std :: string转换为const BYTE *(对于RegSetValueEx()

我有一个函数,得到一个std ::string。 该函数调用 函数RegSetValueEx 第五个参数是registry值的值,并且需要const BYTE *types的variables。 所以我必须将std :: string转换为const BYTE *,并将结果数组的长度作为第6个参数。 我已经find了一个方法来做到这一点,但它感觉很难看,我真的不明白是怎么回事。 这是一个减肥版本的function: void function(const std::string& newValue) { HKEY keyHandle; if(RegOpenKeyEx(HKEY_CLASSES_ROOT, TEXT("some key"),0,KEY_ALL_ACCESS,&keyHandle) == ERROR_SUCCESS) { std::wstring wNewValue; wNewValue.assign(newValue.begin(),newValue.end()); if (RegSetValueEx(keyHandle, TEXT("some value"), NULL, REG_SZ, (const BYTE*)(LPCTSTR)(wNewValue.c_str()), wNewValue.size()*2)==ERROR_SUCCESS) { //do something } RegCloseKey(keyHandle); } } 正如你所看到的,我首先做一个宽string(UNICODE被定义),然后使用双重强制转换,并且长度必须做* 2,否则它只会设置inputstring的一半。 这种forms是否正常/最好的方式来做到这一点? 为什么* 2,有什么更好的办法?

FindFirstFile / FindNextFilerecursionsearch没有find“程序文件”

我已经用C编写了一个应用程序,它使用FindFirstFile / FindNextFile Windows APIrecursionsearch从C:开始的目录。 它成功地遍历文件系统并查找和search所有子目录,但无法search“Program Files”目录。 有没有我在这里失踪的权限问题? 我应该注意到正在运行的应用程序在SYSTEM帐户的上下文中,该帐户是具有访问“程序文件”权限的帐户。 有没有人经历过这个? 我已经完成了很多关于这个问题的答案,但到目前为止还没有发现这种行为的确定性原因。 这里是我用来search目录的代码: static void SearchDirectory(PCHAR pszDirectory) { CHAR szSearch[MAX_PATH] = {0}; CHAR szDirectory[MAX_PATH] = {0}; HANDLE hFind = NULL; WIN32_FIND_DATAA FindFileData; sprintf_s(szSearch, MAX_PATH, "%s%s", pszDirectory, "*"); hFind = FindFirstFileA(szSearch, &FindFileData); if(hFind == INVALID_HANDLE_VALUE) return; do { // Do file processing here etc if(FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY […]

如何使用选定的文件显示资源pipe理器?

什么是API调用显示一个指定的文件select的资源pipe理器窗口? 就像在单击.lnk快捷方式的“属性”对话框中的“查找目标…”button时发生的情况一样? 我知道有一个函数(或一个接口方法),但我忘了名字,并且找不到它。 请注意,我知道的explorer /select,<pathname>命令行,而不是使用它,而不是API调用感兴趣。

从32位进程获取64位进程的命令行string

下面的代码适用于从32位应用程序获取32位进程的命令行string,64位应用程序的64位进程和64位应用程序的32位进程。 如果我尝试从32位应用程序使用64位进程,这将中断。 原因是PROCESS_BASIC_INFORMATION和地址大小的结构大小不同。 所以这里是我的问题 – 1)过程黑客( http://processhacker.sourceforge.net/forums/viewtopic.php?f=15&t=181 )中使用wow64函数给出的build议似乎不工作,并失败,并出现以下错误 – NtWow64ReadVirtualMemory64错误:8000000D读取从A68291A0004028E0 ProcessParameters地址 有没有人试过,可以成功获取信息? 我在论坛上发表了同样的意见。 2)是否有任何其他方法来查询peb信息,可以为x86和x64可靠工作? int get_cmdline_from_pid( DWORD dwPid, char** cmdLine ) { DWORD dw, read; HANDLE hProcess; NtQueryInformationProcess* pNtQip; PROCESS_BASIC_INFORMATION pbInfo; UNICODE_STRING cmdline; WCHAR* wcmdLine; *cmdLine = NULL; hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwPid ); if( !hProcess ) return FALSE; pNtQip = (NtQueryInformationProcess*) […]

以编程方式将访问控制列表(ACL)权限分配给“此文件夹,子文件夹和文件”

我必须分配一个文件夹的权限,它是使用C#.NET编程的子文件夹和文件。 我这样做如下: var rootDic = @"C:\ROOT"; var identity = "NETWORK SERVICE"; //The name of a user account. try { var accessRule = new FileSystemAccessRule(identity, fileSystemRights: FileSystemRights.Modify, inheritanceFlags: InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, propagationFlags: PropagationFlags.InheritOnly, type: AccessControlType.Allow); var directoryInfo = new DirectoryInfo(rootDic); // Get a DirectorySecurity object that represents the current security settings. DirectorySecurity dSecurity = directoryInfo.GetAccessControl(); // […]

是否有可能等到其他线程处理过程input消息?

我想模拟用户input到其他窗口可靠。 我为此使用SendInput ,但是之后我需要等到目标应用程序在发送更多消息之前处理input。 据我所知, SendInput ,尽pipe它的名字,真正的消息发送到队列,不等待,直到他们被处理。 我的尝试是基于这个想法,直到消息队列至less一次是空的。 因为我不能直接检查其他线程消息队列(至less我不知道这样做),所以我使用AttachThreadInput将目标线程的队列附加到该线程的队列,然后使用PeekMessage进行检查。 为了检查function,我使用一个窗口和一个button的小应用程序。 当点击button时,我调用Thread.Sleep(15000)有效地停止消息处理,从而确保在接下来的15s消息队列不能为空。 代码在这里: public static void WaitForWindowInputIdle(IntPtr hwnd) { var currentThreadId = GetCurrentThreadId(); var targetThreadId = GetWindowThreadProcessId(hwnd, IntPtr.Zero); Func<bool> checkIfMessageQueueIsEmpty = () => { bool queueEmpty; bool threadsAttached = false; try { threadsAttached = AttachThreadInput(targetThreadId, currentThreadId, true); if (threadsAttached) { NativeMessage nm; queueEmpty = !PeekMessage(out nm, hwnd, […]

使用Diskpart命令行实用程序隐藏驱动器后如何访问

我想用Diskpart命令行实用程序来隐藏用户的驱动器。 我使用删除字母命令和驱动器变得隐藏。 但是我想用我用C语言编写的程序来使用那个驱动器的数据。 我怎么能做到这一点,或者有可能吗? 我想这样做只适用于USB闪存驱动器。 如果这是不可能的,请给我另一种方法来正确地做到这一点? 非常感谢,祝你好运。

RASPHONE.exe和RASDIAL.exe之间的区别

我尝试以编程方式build立拨号连接。 我尝试使用RASdial.exe和RASPhone.exe,除RasDial.exe显示在RasUp.exe在用户界面中给出的控制台中的错误外,两者都是一样的。 有人可以解释我Rasdial和Rasphone之间的区别,也是正确的一个拨号连接。 我想在用户界面中的错误消息,而不是在控制台。 请详细解释一下。

用户locking屏幕的Windows消息

我正在用C ++编写老式Windows编程,我需要在我的WndProc中捕获一个表示用户已经注销或locking屏幕的事件。 更新 (谢谢David Hefernan)我到处search,但唯一发现的是WM_ENDSESSION消息 – 它不处理屏幕locking事件。 任何人都知道这是怎么做的? 我需要通过Windows XP的风格将其应用到Windows 2000。

在将ASCIIstring传递给Windows API函数之前将其转换为UTF-16

在我目前的项目中,我一直在使用宽字符(utf16)。 但是因为我唯一的用户input将是一个URL,反正最后还是一个string,另外一个string,我只想把整个程序切换到ascii。 我的问题是,在将string传递给Windows API函数之前将string转换为utf16有什么好处吗? 在网上做了一些研究之后,好像很多人推荐这个,如果你不在Windows上使用UTF-16。