根据文件:
"如果您希望应用程序使用ComCtl32.dll版本6,则必须添加应用程序清单或编译器指令,以指定如果版本6可用,则应使用该版本."
注意上面的逻辑OR?那么这个神秘的编译器指令是什么?
我有一个原生的Win32 C++应用程序,它完全包含在一个.cpp文件中.没有资源文件,清单文件等.我想保持这种方式,但我也想使用视觉样式.
我正在使用WindowsAPICodePack for TaskDialog.当我尝试显示对话框时,它说它需要加载comctl32.dll的版本6.所以我在app.manifest中添加了第6版并尝试运行它.仍然没有运气.我去了Debug文件夹并运行没有Visual Studio的程序,它工作正常.我猜测Visual Studio没有使用清单文件......我想知道是否有办法让它做到这一点.
列表视图控件具有LVM_GETTOPINDEX允许获取最顶层可见项的索引的消息。
现在我需要设置最上面的可见项目,但令人惊讶的是没有任何 LVM_SETTOPINDEX消息是自然的。
有没有一种简单干净的方法来设置最上面的项目?
我的列表控件始终处于报告模式。
这是我最近发现的最有趣的问题之一.我们有一个传统的Delphi 5程序(Rave Reports 4引用阻止升级到D2007).
使用模板生成的版本资源编译程序时,它可以正常工作.当模板生成的清单资源也添加到程序的dpr时,就会出现问题.
Manifest是一个"通用"ASCII文件:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
name="Name"
processorArchitecture="x86"
version="2.0.0.0"
type="win32"/>
<description>Desc</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="x86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
</application>
</compatibility>
</assembly>
Run Code Online (Sandbox Code Playgroud)
在App.dpr中有一个清单资源引用:
{$R 'manifest.res' 'manifest.rc'}
Run Code Online (Sandbox Code Playgroud)
通过调用编译清单:
C:\Program Files\Borland\Delphi5\Bin\brcc32.exe manifest.rc
Run Code Online (Sandbox Code Playgroud)
当程序启动时,会引发异常:
exception class : EAccessViolation
exception message : Access violation at address 75A1A890 in module 'KERNELBASE.dll'. Read of address 00000001.
Run Code Online (Sandbox Code Playgroud)
主线程的调用堆栈: …
我无法使用GCC(MinGW)将Comctl32.lib链接到我的程序.
GCC输入:
gcc -o program.exe main.c images.o -lgdi32 -lcomctl32 -mwindows
Run Code Online (Sandbox Code Playgroud)
GCC输出
main.c: In function 'WinMain':
main.c:120:2: error: unknown type name 'INITCOMMONCONTROLSEX'
main.c:124:9: error: request for member 'dwICC' in something not a structure or union
Run Code Online (Sandbox Code Playgroud)
main.c中的相关代码
#define _WIN32_WINNT _WIN32_WINNT_WIN7
#include <windows.h>
#include <commctrl.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmd)
{
Line 120: INITCOMMONCONTROLSEX icex;
Line 124: icex.dwICC = ICC_LISTVIEW_CLASSES;
InitCommonControlsEx(&icex);
}
Run Code Online (Sandbox Code Playgroud)
感谢您提供的任何帮助或信息.我已经这么久了,只是无法得出答案.
我有一个基于MFC的程序,在应用更新3059317之前工作正常:
MS15-060:Microsoft公共控件中的漏洞可能允许远程执行代码:2015年6月9日)
此更新将替换Comctl32.dll为新版本.
应用此更新后,打开对话框只会挂起程序.并非所有对话框都会受到影响,但打印预览始终处于挂起状态,但不会导致程序崩溃.它变得没有反应.
我不知道如何尝试调试此问题以找到解决方法.程序挂起时创建内存转储会产生以下堆栈跟踪:
comctl32.dll!751f8505()
Xxx.exe!CWnd::WindowProc(unsigned int message, unsigned int wParam, long lParam) Line 2095 + 0x13 bytes
Xxx.exe!AfxCallWndProc(CWnd * pWnd, HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 285
Xxxx.exe!AfxWndProc(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 434 + 0x10 bytes
user32.dll!76aafd72()
user32.dll!76aa84de()
user32.dll!76aafd72()
user32.dll!76aa9f8d()
ntdll.dll!77dd5a7e()
user32.dll!76aaa2af()
comctl32.dll!75249cfb()
comctl32.dll!751fb559()
user32.dll!76aafd72()
user32.dll!76aafe4a()
user32.dll!76ab09d3()
user32.dll!76abb759()
Xxx.exe!CWnd::DefWindowProcA(unsigned int nMsg, unsigned int wParam, long lParam) Line 1116 + 0x7 bytes …Run Code Online (Sandbox Code Playgroud) 我写了一个函数,它可以生成树视图项的文本,即使树视图在远程进程中也是如此.该函数在远程进程中分配两个内存块,填充TVITEM结构(复制到远程进程中),发送TVM_GETITEM消息,最后将第二个远程内存块的内容读回本地缓冲区.这是代码:
std::string getTreeViewItemText( HWND treeView, HTREEITEM item )
{
DWORD pid;
::GetWindowThreadProcessId( treeView, &pid );
HANDLE proc = ::OpenProcess( PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, FALSE, pid );
if ( !proc )
// handle error
TVITEM tvi;
ZeroMemory( &tvi, sizeof(tvi) );
LPVOID tvi_ = ::VirtualAllocEx( proc, NULL, sizeof(tvi), MEM_COMMIT, PAGE_READWRITE);
if ( !tvi_ )
// handle error
TCHAR buffer[100] = { 'X' };
LPVOID txt_ = ::VirtualAllocEx( proc, NULL, sizeof(buffer), MEM_COMMIT, PAGE_READWRITE );
if ( !txt_ )
// handle error
tvi.mask …Run Code Online (Sandbox Code Playgroud) 我在一个COMCTL32.DLL加载两次的进程内运行,一次使用版本5.82.7601.17514,一次使用版本6.10.7601.17514.旧版本由程序链接的一些遗留DLL加载,另一个版本由较新的DLL加载.
如果我使用GetModuleHandle (L"COMCTL32.DLL")我无法控制解决的DLL.
GetProcAddress例如,当我调用到达时,TaskDialogIndirect我得到一个空指针,这当然是因为我找回了遗留DLL的句柄.
那么,是否有一些方法可以获取地址,比如TaskDialogIndirect何时加载两个DLL.
如果没有,我可以以某种方式确保该进程加载6.10版本而不是5.82,希望我们的旧版DLL能够在较新版本的情况下正常运行COMCTL32吗?