У меня проблема с автоматизацией MS Word DDE, управляемой нашей системой CRM.
Настройка
Основой для созданного документа является шаблон Word .dot, который запускает макрос в Document.New. Внутри этого макроса я создаю компонент .Net, зарегистрированный для COM.
Set myCOMObject = CreateObject("MyCOMObject")
Компонент извлекает некоторые данные из базы данных и передает строковые значения, которые присваиваются Word DocumentVariables.
Set someClass = myCOMObject.GetSomeClass(123)
ActiveDocument.Variables("docaddress") = someClass.GetSenderAddress(456)
Все строковые значения, возвращаемые компонентом, кодируются в UTF-16 (кодовая страница 1200).
Что происходит
Проблема возникает, когда система CRM вызывает Word для создания нового документа с помощью DDE (winword.exe / n / dde): строковые значения из компонента преобразуются в строки в кодировке UTF-8.
Весь статический текст внутри шаблона остается хорошо закодированным в UTF-16 - например, umlaut ü внутри моих DocumentVariables превращается в c3 b0 , пока он остается fc для остальной части документа (проверенный файл в шестнадцатеричном редакторе).
Если я создаю документ из шаблона с той же самой макрофункцией напрямую (без DDE), все строки в порядке; т.е. кодируются в UTF-16.
Побочные эффекты
Если я создаю новый документ из моего шаблона, оставляю этот документ открытым и создаю новый документ, управляемый DDE, символы кодируются правильно!
Это также работает наоборот: создание документа, управляемого DDE, сначала нарушает кодировку символов при создании второго документа напрямую.