Кириллица для DRM


Здравствуйте, уважаемые читатели нашего блога.
В первой своей статье хочу поделиться с вами информацией как можно заставить продукт Hyperion DRM дружить с кириллицей. Как вы наверно знаете, вплоть до текущей версии 11.1.1.2 система Hyperion DRM не является мультиязычной как на уровне интерфейса, так и на уровне данных, с которыми система работает. Но при желании ей можно заставить работать с кириллицей и другими языками.

Что для этого необходимо, во-первых, чтобы база данных репозитория, на уровне экземпляра была создана в кодировке UTF-8 или UTF-16. Но этого не всегда бывает достаточно, на отдельных клиентских местах могут возникать проблемы с кириллическими символами, которые могут отображаться в виде знаков вопроса.

Опытному айтишнику достаточно беглого взгляда на интерфейс системы чтобы определить что система написана на Delphi или на С++ Builder. Выдают происхождение системы знакомые интерфейсные компоненты.

Некорректно работа программы с кириллицей, связанна с особенностями работы базового класса “TApplication” от которого наследуется класс нашего приложения. Дело в том, что в процедуре инициализации “Initialize”присутствует код, который явно вызывает Windows API функцию “SetThreadLocale” и передает ей в качестве аргумента пользовательские региональные настройки. Как решить эту проблему когда то обсуждалось здесь: http://forum.vingrad.ru/topic-82093/view-all.html

Что интересно, эта же проблема с кириллицей касается и QIP ;-).

Единственное, что мы не сможем изменить уже скомпилированный код, поэтому мы пойдем несколько по другому пути.

План действий такой:

  1. На клиентских машинах в параметрах языка и региональных настроек на закладке дополнительно выбрать русский язык, в разделе “Выберите язык, соответствующий языку используемых программ, которые не поддерживают Юникод”.
  2. Создать динамическую библиотеку (DLL), которая будет выполнять нужное нам действия
  3. Внедрить нашу DLL в адресное пространство клиентского процесса mdm_ntier_client_http.exe

Пишем динамическую библиотеку которая в своем конструкторе выполняет одно недостающее действие :  SetThreadLocale(MAKELCID( MAKELANGID(LANG_RUSSIAN, SUBLANG_DEFAULT), SORT_DEFAULT) ).

// ChangeLocale.cpp : Defines the entry point for the DLL application.

#include «stdafx.h»

BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
SetThreadLocale(MAKELCID( MAKELANGID(LANG_RUSSIAN, SUBLANG_DEFAULT), SORT_DEFAULT));
return TRUE;
}

Компилируем нашу DLL. Или же можете взять уже скомпилированную мной:

Теперь осталось только внедрить её в адресное пространство нашего клиентского процесса. Для этого воспользуемся программой DLL Injector, скачать её можно здесь:

Далее пишем BAT файл, который будет запускать клиентское приложение Hyperion DRM, с внедренной нашей DLL.

“dll_inject.exe” “ChangeLocale.dll” “mdm_ntier_client_http.exe”

И вот результат, поддержка кириллицы:

 

1 thought on “Кириллица для DRM”

  1. Кирилл и Мефодий во всей красе 🙂
    Зачет с плюсом!

    Их бороды куда как более красноречивее подтверждают замысел раздела “Не для девочек!”

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s