【问题标题】:ActiveX Control - MFC LocaleActiveX 控件 - MFC 语言环境
【发布时间】:2012-07-20 11:31:33
【问题描述】:

我有一个用 Visual Studio 2008 开发的 MFC 应用程序,我在其中使用 Adob​​e ActiveX 控件(我安装了 Adob​​e Reader X)。我尝试使用 setViewRect 函数设置缩放矩形,效果很好。

现在问题出现在我的 Windows 区域设置中,十进制符号设置为逗号而不是点(例如在德语区域设置中)。缩放矩形的参数似乎解释不正确。

我使用 ProcessMonitor 并发现当 Adob​​e ActiveX 控件被创建并在我的进程中加载​​它的 DLL 时,它调用 setlocale,因此应用程序使用当前的 Windows 区域设置而不是默认的“C”区域设置。因此,应用程序以错误的方式解释数字。

我尝试在加载 Adob​​e 后立即将区域设置重置为“C”,此解决方法解决了问题。

现在,当我将应用程序迁移到 Visual Studio 2010 时,问题再次发生。显然 Adob​​e DLL ("c:\Program Files (x86)\Common Files\Adobe\Acrobat\ActiveX\AcroPDF.dll") 是使用 Visual 开发的Studio 2008。因此,当它设置区域设置时,它是在 MSVCR90.dll 中完成的。当我重置语言环境时,我使用了相同的 DLL。

现在我的应用是VS2010,调用setlocale是在MSVCR100.dll中完成的,所以不会影响已经在MSVCR90.dll中设置的locale。

有没有办法设置我在应用程序中托管的 COM 对象的语言环境?

提前非常感谢你:)

【问题讨论】:

    标签: visual-studio mfc activex msvcrt setlocale


    【解决方案1】:

    这只是在黑暗中的一个镜头,但您可以尝试使用LoadLibrary 加载 MSVCR90.dll(由于 DLL 已经加载,它只会给您一个 HANDLE,它不会加载它两次),然后使用GetProcAddress 找到指向其 setlocale 函数的指针。然后,您将能够调用此 DLL 的 setlocale 函数。这是一个丑陋的 hack,但它可能会起作用。

    【讨论】:

    • 感谢您的回复 :) 我尝试这样做,但不幸的是 LoadLibrary(_T("MSVCR90.dll")) 返回一个 NULL 句柄。只有当我使用 MSVCR90.dll (C:\\Windows\\winsxs\\x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.6161_none_50934f2ebcb7eb57\\msvcr90.dll) 的完整路径加载库时它才有效。
    • 是的 :) 谢谢你的提示 :) 我只是无法在我的应用程序中使用完整路径。
    • EnumProcessModulesExGetModuleFileName。我只是通过谷歌搜索“枚举进程 dll”和“获取模块文件名”找到了它们。如果你不寻找方法,你就不会找到它。你不应该这么轻易放弃。
    猜你喜欢
    • 2012-07-26
    • 1970-01-01
    • 2011-06-24
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多