Tag: winapi

我可以从Visual Studio立即窗口调用Win32 API吗?

我正在调试一个C ++ Win32应用程序,我想从该进程的上下文中调用一个任意的Win32 API,就好像该程序运行了这行代码: DestroyWindow(0x00021c0e); 但是进入立即窗口会给出: CXX0017: Error: symbol “DestroyWindow” not found 编辑:使用函数的全名{,,user32.dll}_NtUserDestroyWindow@4 ,我可以使用立即窗口来了解我的意思,并显示函数的地址: {,,user32.dll}_NtUserDestroyWindow@4 0x76600454 _NtUserDestroyWindow@4 但当我尝试调用它时,会发生这种情况: {,,user32.dll}_NtUserDestroyWindow@4(0x00021c0e); CXX0004: Error: syntax error 甚至可以像这样从立即窗口调用C函数,还是我咆哮错误的树?

我应该从Windows代码中删除TCHAR吗?

我正在修改一些非常古老的(10年)C代码。 该代码在Unix / Mac上使用GCC进行编译,并使用MinGW对Windows进行交叉编译。 目前整个都有TCHAR字符串。 我想摆脱TCHAR并使用C ++字符串代替。 是否仍然需要使用Windows范围的function,或者我现在可以使用Unicode和UTF-8完成所有操作吗?

如何正确打印__FILE__扩展的字符串?

考虑这个程序: #include int main() { printf(“%s\n”, __FILE__); return 0; } 根据文件的名称,此程序可以工作 – 或不工作。 我面临的问题是我想以编码安全的方式打印当前文件的名称。 但是,如果文件具有无法在当前代码页中表示的有趣字符,则编译器会发出警告(这是正确的): ?????????.c(3) : warning C4566: character represented by universal-character-name ‘\u043F’ cannot be represented in the current code page (1252) 我该如何解决这个问题? 我想将__FILE__给出的字符串存储在例如UTF-16中,这样我就可以在运行时在任何其他系统上正确打印它(通过将存储的UTF-16表示转换为运行时系统使用的任何表示)。 为此,我需要知道: __FILE__给出的字符串使用了什么编码? 看来,至少在Windows上,使用了当前的系统代码页(在我的例子中是Windows-1252) – 但这只是猜测。 这是真的? 如何在构建时将源代码中的字符串的UTF-8(或UTF-16)表示存储起来? 我的真实用例:我有一个跟踪当前程序执行的宏,将当前源代码/行号信息写入文件。 它看起来像这样: struct LogFile { // Write message to file. The file should […]

InterlockedIncrement参数声明为volatile的影响是什么

InterlockedIncrement和其他Interlocked操作将其参数声明为volatile。 为什么? 这是什么意图和影响?

为什么这个BitBlt示例不再起作用?

我现在正在使用Petzold的书(第5版)回到一些Windows编程。 我使用BitBlt编译了以下示例 ,它不能正常工作。 它应该复制Window的(CxSource,CySource)大小的图标并在整个窗口的表面上复制它。 实际上,使用Windows 7会发生什么,窗口下方的位图会被获取并复制到绘图表面,即hdcClient。 我不明白为什么它表现得像这样知道很明显传递给BitBlt的DC是hdcWindow,它指的是通过当前应用程序的GetWindowDC(hwnd)获得的设备上下文。 我首先想到的是,默认情况下启用了透明度模式,但是停用它并不会改变任何东西。 BitBlt似乎总是占据应用程序窗口下方的表面! 我不明白! :)任何人都知道为什么它的工作原理以及如何修复它?

库初始化 – Win32实现中的pthread_once

你好。 我试图为我的库创建一个完全线程安全的初始化函数,我不能轻易找到pthread_once的替代品,这应该很容易解决问题。 我来这个代码: void libInit (void) { #ifdef WIN32 static volatile int initialized = 0; static HANDLE mtx; if (!initialized) { if (!mtx) { HANDLE mymtx; mymtx = CreateMutex(NULL, 0, NULL); if (InterlockedCompareExchangePointer(&mtx, mymtx, NULL) != NULL) CloseHandle(mymtx); } WaitForSingleObject(mtx); if (!initialized) { libInitInternal(); initialized = 1; } ReleaseMutex(mtx); } #else static pthread_once_t initialized = […]

设置了OFN_ALLOWMULTISELECT标志的GetOpenFileName()

我正在尝试使用GetOpenFileName()常用对话框调用弹出一个对话框并允许用户选择多个文件。 我已经设置了OFN_ALLOWMULTISELECT标志,以及OFN_EXPLORER设置,所以我得到了“新样式”文件选择框。 当我设置我的OPENFILENAME结构时,我有ofn.lpstrFile指向分配用于保存结果的缓冲区,并且ofn.nMaxFile设置为其长度。 我遇到的问题是,如果用户选择了这么多文件名,缓冲区将溢出,则对GetOpenFileName的调用返回FALSE,然后CommDlgExtendedError()返回FNERR_BUFFERTOOSMALL。 这对于错误检测很好,我可以增加缓冲区的大小来修复它,但是用户迟早会选择足够的文件名来溢出缓冲区。 我已经看到MSDN中的注释说明如果缓冲区太小,lpstrFile缓冲区的前两个字节将包含所需的大小,但它返回的大小似乎太小(当OFN_ALLOWMULTISELECT不是’时,这可能是正确的’ t set)。 另外,这需要我再次打开对话框! 我的另一个想法是创建一个对话框挂钩程序,然后在我收到CDN_SELCHANGE通知消息时检测文件名的大小并动态分配一个正确大小的缓冲区,但是当它将数据写入新缓冲区时,似乎记住ofn.nMaxFile的orignal值。 有没有人知道动态分配缓冲区来保存GetOpenFile调用结果而不使对话框出现两次的正确方法? 所以,事实certificate,Martlark的文章是正确的。 我的两个错误是: 1)我忘了将MAX_PATH添加到钩子中的大小,并且 2)这仅适用于GetOpenFileName的unicode版本。 (我正在使用未定义的UNICODE进行编译)

为什么我的socket的开放端口没有被netstat列出?

如果您运行此示例,您将看到netstat从未列出该端口。 为什么? 我怎么做到这一点? #include #include #include #pragma comment(lib, “WS2_32”) int main() { WORD wVers = MAKEWORD(2, 2); WSADATA wsa; WSAStartup(wVers, &wsa); SOCKET sock = socket(AF_INET, SOCK_STREAM, 6); if (sock != INVALID_SOCKET) { struct sockaddr_in addr = { 0 }; addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); int addrlen = sizeof(addr); bind(sock, (struct sockaddr *)&addr, addrlen); if […]

如何更改Win32 API应用程序中的控件主题?

如果我在Win32 API中创建一个按钮,则默认的conrol主题看起来像Windows 95/98按钮。 我记得过去微软论坛告诉我如何获得XP风格,但我不记得如何做到这一点。 有没有办法以编程方式或手动更改Win32应用程序中的控件主题? 谢谢。

从进程名称获取进程ID

嗨,我正在尝试使用C语言的Windows API做一个项目。 我项目中的一小部分是获取lsass.exe的进程ID。 我试过下面的程序,但它不会工作。 我已经阅读了有关CreateToolhelp32Snapshot,Process32First,Process32Next函数的任何人可以帮助我解释如何在代码中使用它们。 所以请帮助我。 我是Windows API的初学者,所以如果有人能建议我推荐一本好的电子书,我会很感激。