使用颜色管理模块 (CMM)
(CMM) 的颜色管理模块是 WCS 代码的模块,这些模块使用设备配置文件中的信息来执行颜色转换和颜色映射。 应用程序开发人员不必实现 CMM。 Microsoft 提供默认 CMM。 但是,如果你确实编写了需要使用专用颜色转换和颜色映射算法的软件,则可以创建一个。
注意
CMM 入口点 不是 API 函数,不应由应用程序调用。
安装 CMM 后,安装程序会在 Windows 注册表中注册它们。 应用程序可以枚举已注册的 CMM,并使用 SelectCMM 函数选择一个 CMM。 以下示例应用程序演示如何枚举所有已注册的 CMM。
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
#include <mbstring.h>
#include <windows.h>
#include <icm.h>
#ifdef WINDOWS_98
TCHAR gszICMatcher[] = __TEXT(
"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\ICM\\ICMatchers");
#else
TCHAR gszICMatcher[] = __TEXT(
"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ICM\\ICMatchers");
#endif
_CRTAPI1 main (int argc, char *argv[])
{
DWORD dwNumCMM = 0;
HANDLE hkCMM;
DWORD dwErr = RegCreateKey(HKEY_LOCAL_MACHINE,
gszICMatcher, &hkCMM);
DWORD dwMaxName, dwMaxValue;
DWORD dwInfoErr = RegQueryInfoKey(&hkCMM, NULL, NULL,
NULL, NULL, NULL, NULL, NULL,
&dwMaxName, &dwMaxValue,
NULL, NULL);
TCHAR chCMM[dwMaxName];
ULONG cjCMM = sizeof(chCMM)/sizeof(chCMM[0]);
DWORD dwType;
TCHAR chCMMFile[dwMaxValue];
ULONG cjCMMFile = sizeof(chCMMFile)/sizeof(chCMMFile[0]);
if (dwErr != ERROR_SUCCESS)
{
printf("Could not open ICMatcher registry key: %d\n", dwErr);
}
if (dwErr == ERROR_SUCCESS)
{
while (RegEnumValue(
hkCMM,dwNumCMM,chCMM,
&cjCMM,NULL,&dwType,
chCMMFile,&cjCMMFile) == ERROR_SUCCESS)
{
if (dwType == REG_SZ)
{
printf("%d: %-80s - %-80s\n",dwNumCMM,chCMM,chCMMFile);
}
else
{
printf("%d: error\n");
}
dwNumCMM++;
cjCMM = sizeof(chCMM);
cjCMMFile = sizeof(chCMMFile);
}
}
RegCloseKey(hkCMM);
}