Tag: winapi

CreateProcess()不会使用CREATE_NEW_CONSOLE标志创建一个新窗口 – C / C ++

我一直在尝试使用Windows API创建一个使用CreateProcess()的进程。 即使在浏览网页后,我也无法出于某种原因创建新的控制台。 我做的研究: 我使用MSDN示例代码作为我应该在函数中使用的参数的基础: http://msdn.microsoft.com/en-us/library/windows/desktop/ms682512%28v=vs.85%29.aspx 我阅读了以下MSDN文章,了解有关如何创建新控制台窗口的信息: http://msdn.microsoft.com/en-us/library/windows/desktop/ms682528%28v=vs.85%29.aspx 我也读了一个类似的SO问题来解决有同样问题的人: CreateProcess不会在Windows 7下创建其他控制台窗口? 结果: 我已经编写了我将在下面发布的代码,其中包含创建新控制台所需的所有要求,但它没有按预期运行。 我花了很长时间试图自己找到答案,但上面的文章是我通过谷歌找到的唯一相关的。 会发生什么是创建过程,但它在我的C程序控制台中。 我希望能够在没有它的情况下创建程序的程序控制台。 还有其他差异。 如果我在do-while循环中打印了很多字符而没有Sleep()来减慢它的速度,则TerminateProcess()将失败并且拒绝访问,当我按下转义键时程序将崩溃。 这也是不希望的行为。 这是我现在的C程序: #include #include #include #define WIN32_LEAN_AND_MEAN #include #include #define IS_PRESSED( vk ) ( GetAsyncKeyState( vk ) & 0x8000 ) typedef struct process { PROCESS_INFORMATION p_info; STARTUPINFO s_info; } process; void win_error( char * message, int is_exit […]

在WIN32中的“BUTTON”类窗口上显示位图

编辑:我认为在创建子窗口期间(即我的按钮)不会发送WM_CREATE消息。 因此,通过在WM_CREATE期间调用SendMessage,我正在向尚未创建的窗口发送消息。 现在的解决方案是在WM_SHOWWINDOW消息期间调用SendMessage()。 子窗口是否在创建时发送WM_CREATE消息? 为什么按钮上没有显示位图? 位图是180×180像素。 我有一个资源文件: Bit BITMAP bit.bmp 然后我创建主窗口和一个子“BUTTON”窗口,其中包含: HWND b, d; b = CreateWindow(L”a”, NULL, WS_OVERLAPPEDWINDOW, 0, 0, 500, 500, 0, 0, hInstance, 0); d = CreateWindow(L”BUTTON”, NULL, WS_CHILD | WS_VISIBLE | BS_BITMAP, 10, 10, 180, 180, b, 200, hInstance, 0); 然后,在我的Windows程序中,我向“BUTTON”窗口发送“BM_SETIMAGE”消息: HBITMAP hbit; case WM_CREATE: // It works if I change […]

CreateFile始终覆盖指定的文件

我正在尝试记录我使用Windows-API和C语言编写的服务所做的操作,因此我创建了一个日志文件系统。 问题是,在每次CreateFile调用时,都会覆盖该文件,而不是只打开它并在文件末尾写入。 这是我的WriteInLogfile函数的代码: void WriteInLogFile(LPCTSTR log_string) { HANDLE hFile; DWORD dBytesWritten; if ((hFile = CreateFile(LOG_FILE_PATH, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE && (GetLastError() == ERROR_FILE_NOT_FOUND)) { if ((hFile = CreateFile(LOG_FILE_PATH, GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL)) != INVALID_HANDLE_VALUE) { if (!WriteFile(hFile, log_string, strlen(log_string), &dBytesWritten, NULL)) aff_error(“WriteInLogFile”); CloseHandle(hFile); } } else { if (!WriteFile(hFile, […]

如何在Windows上的C中实现计时器

如何在C中创建一个计时器,在时间到期后,我应该可以调用一个回调函数。 平台是窗户。 有人可以指导我 此致,Mithun

未定义引用`_GetAdaptersAddresses @ 20′ – 但我包括-liphlpapi

我在cygwin下使用gcc编写一些代码,在我的代码中调用来自iphlpapi.h GetAdaptersAddresses我已经将_WIN32_WINNT设置_WIN32_WINNT高于所需的0x0501并且在链接器行上我添加了-liphlpapi但是链接器仍然失败了以下内容信息: gcc -liphlpapi build/obj/*.o -Wall -Wextra -o build/bin/asdf.exe src/asdf.cpp /tmp/ccdjLPVY.o:asdf.cpp:(.text+0x153): undefined reference to `_GetAdaptersAddresses@20′ collect2: ld returned 1 exit status 来自asdf.cpp一些片段: #if _WIN32_WINNT < 0x0501 #warning _WIN32_WINNT was set lower than 0x0501, fixing #undef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif #include #include 我知道他们在那里蠢蠢欲动: strings /usr/i686-pc-mingw32/sys-root/mingw/lib/libiphlpapi.a | sort | uniq | grep GetAdapters __imp__GetAdaptersAddresses@20 __imp__GetAdaptersInfo@8 _GetAdaptersAddresses@20 […]

在multithreading上下文中正确处理GetLastError(和其他)

假设GetLastError(和变体)是每个线程还是每个进程是正确的? 如果它是per-process的问题在multithreading应用程序中有些明显,因为没有办法保证在失败的调用和GetLastError之间没有进行其他Win32调用。 有时,GetLastError的值很重要。 例如,如果使用IO完成端口,则AcceptEx将返回FALSE(失败)。 WSAGetLastError(类似于GetLastError)将返回ERROR_IO_PENDING以通知您它已被挂起并且失败不是由于其他原因造成的。 问题是,有数十个其他呼叫可以在飞行中并覆盖此值。 这些调用是特定于线程还是特定于进程? 如果是特定于流程,那么如何正确处理?

MD5加密API为某些明文返回错误的哈希值

我正在尝试使用Microsoft加密API来计算MD5哈希值,但是我得到的哈希值不正确: #include #include #include char* HashMD5(char* data, DWORD *result) { DWORD dwStatus = 0; DWORD cbHash = 16; int i = 0; HCRYPTPROV cryptProv; HCRYPTHASH cryptHash; BYTE hash[16]; char *hex = “01234567879abcdef”; char *strHash = “00000000000000000000000000000000”; if(!CryptAcquireContext(&cryptProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) { dwStatus = GetLastError(); printf(“CryptAcquireContext failed: %d\n”, dwStatus); *result = dwStatus; return NULL; } […]

如何检测win32上的datacard连接和断开事件?

我有一张数据卡,一旦插入数据卡,我就会使用wm_device_change事件获取事件。 但是,当我的数据连接实际连接到外部世界时,我也希望得到事件。 我的意思是说,一旦我们点击数据卡的连接/断开按钮,我就想得到这个事件。 换句话说,我想知道什么时候建立连接并断开连接。 数据卡是Vodaphone数据卡,我正在尝试使用该数据卡进行浏览。 无论什么是SDK,操作系统应该在某个地方获得连接和断开网络的事件是否有任何方法来访问操作系统正在获取的事件。 正如我在通知中看到的那样,Vodaphone连接和LAN连接的变化。 数据卡是其中具有SIM的USB设备,并且可以用于通过GPRS访问互联网。 如何在Win32 C / C ++程序中执行此操作?

hwnd到ppm问题

我有一个将hwnd保存到ppm文件的function。 此函数的灵感来自msdn示例。 msdn示例和我的函数都工作但是…我有一个问题…… 但首先,这是function。 int CaptureAnImage(HWND hWnd) { HDC hdcWindow; HDC hdcMemDC = NULL; HBITMAP hbmScreen = NULL; RECT rc; BITMAPINFOHEADER bi; DWORD dwBmpSize; HANDLE hDIB; char *lpbitmap; int w, h; FILE *f; // Retrieve the handle to a display device context for the client // area of the window. hdcWindow = GetDC(hWnd); // Create […]

为基于对话框的应用程序实现回调函数

我正在阅读一篇关于如何在Visual C ++中创建基于对话框的GUI应用程序的非常古老的教程( 源代码 – 葡萄牙语)。 基于我对WinAPI编程的薄弱知识,我决定修改建议的代码主要是为了实现两件事: 1)与Unicode编程标准的一致性(例如使用wWinMain和MessageBoxW而不是WinMain和MessageBox/MessageBoxA )。 这样的“标准”似乎全面实施。 示例: 这个问题(评论) 2)在创建非空Win32项目时,Visual Studio提供的模型的一致性。 我这样做并注意到: “关于”对话框的回调函数是INT_PTR类型而不是BOOL ; WndProc函数返回0,而不是TRUE(这是1),如教程中所示; msg变量的switch语句默认返回DefWindowProc()而不是FALSE; 没有指定WM_CLOSE处理(我猜对话框对某些事件有默认处理)。 _ 因此,有一个奇怪的行为,其中名为Confirm的MessageBox失焦 – 即我无法单击“确定”和“取消”按钮。 问题:我是否正确地假设Visual Studio生成的模板代码比教程中的代码更正确,这对我来说似乎不值得信任? 如果是的话,我忘了什么吗? 我的代码出了什么问题,为什么我不能单击Messagebox按钮? 我的最终代码如下: #define WIN32_LEAN_AND_MEAN #include #include “resource.h” INT_PTR CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: return (INT_PTR)TRUE; case WM_DESTROY: PostQuitMessage(0); […]