2013-02-11 102 views
0

我构建了一个模块,该模块使用windows'编辑窗口类的编辑框创建窗口。它只能用于ansi字符集,不能使用任何unicode。我使用EM_GETHANDLE来接收编辑控件的缓冲区。强制使用ANSI编辑控件而不使用comctl32编辑控件

现在,这里是我的问题:(从上面的链接引用)

Note For Comctl32.dll version 6, the buffer always contains an array of WCHARs, regardless of whether an ANSI or Unicode function created the edit control. For more information on DLL versions, see Common Control Versions.

所以,当我的模块被由已经COMCTL32初始化一个应用程序,我的整个代码加载断裂。

我的问题:有没有办法阻止CreateWindowA使用comclt32或有人有想法解决这个问题?

+0

您的预防答案在引用文字中。 Unicode有什么问题,特别是如果你不打算全面支持它的话。只要扔掉或忽略你无法处理的东西,或者更好地输入一些你不想处理的东西,例如给用户一个错误信息。非ASCII字符。 – 2013-02-11 12:26:45

回答

1

如果应用程序的清单中指定了应用程序,则应用程序使用COMCTL32.DLL,例如,在这里:http://msdn.microsoft.com/en-us/library/windows/desktop/bb773175%28v=vs.85%29.aspx

如果你的模块的DLL,那么你可以尝试使用一些隔离技术,因此不依赖于该.exe决定使用什么版本的COMCTL32.DLL,但可能会带来许多其他弊端。

我推荐使用WM_GETTEXTAGetWindowTextA(),它会将转换后的字符串复制到缓冲区中。设计一个需要老版本的DLL才能正常工作的模块简直就是个坏主意。

+0

感谢您的回答。我需要使用'EM_GETHANDLE',因为我使用该句柄直接访问控件的缓冲区并写入(我知道我可能不会这样做!)。 我想我需要使用CreateWindowW编辑控件来解决我的问题。 – typ1232 2013-02-11 12:37:05

+0

或者,使用'IsWindowUnicode()'来确定编辑窗口是由CreateWindowA()或CreateWindowW()创建的,然后调整缓冲逻辑以相应地使用CHAR或WCHAR。 – 2013-02-11 18:13:10