I'm facing a problem with a MS Word DDE Automation controlled by our CRM system.
The setup
Base for the document created is a Word .dot template which fires a macro on Document.New. Inside this macro I create a .Net component registered for COM.
Set myCOMObject = CreateObject("MyCOMObject")
The component pulls some data from a database and hands string values which are assigned to Word DocumentVariables.
Set someClass = myCOMObject.GetSomeClass(123)
ActiveDocument.Variables("docaddress") = someClass.GetSenderAddress(456)
All string values returned from the component are encoded in UTF-16 (codepage 1200).
What happens
The problem arises when the CRM system calls Word to create a new doc by DDE (winword.exe /n /dde): The string values from the component are turned into UTF-8 encoded strings.
All the static text inside the template stays nicely encoded in UTF-16 - example the umlaut ü inside my DocumentVariables is turned into c3 b0 while it stays fc for the rest of the document (checked file in hex editor).
If I'm creating a document from a template with the same macro functionallity directly (without DDE) all strings are fine; i.e. are encoded in UTF-16.
Side effects If I create a new document from my template, keep this document open and create a new document controlled by DDE the characters are encoded correctly!
This also works the other way round: creating a DDE controlled document first breaks the character encoding when creating a second document directly.
As it turns out the solution is to replace the database access via System.Data.OleDb
OleDbCommand command = new OleDbCommand(query, connection);
OleDbParameter companyIdParam = command.CreateParameter();
companyIdParam.ParameterName = "companyId";
companyIdParam.Direction = ParameterDirection.Input;
companyIdParam.OleDbType = OleDbType.Integer;
companyIdParam.Value = companyId;
command.Parameters.Add(companyIdParam);
by System.Data.OracleClient
OracleCommand command = new OracleCommand(query, connection);
OracleParameter companyIdParam = command.CreateParameter();
companyIdParam.ParameterName = "I_COMPANYID";
companyIdParam.Direction = ParameterDirection.Input;
companyIdParam.OracleType = OracleType.Number;
companyIdParam.Value = companyId;
command.Parameters.Add(companyIdParam);
Or by Oracle.DataAccess.Client
OracleCommand command = new OracleCommand(query, connection);
OracleParameter companyIdParam = command.CreateParameter();
companyIdParam.ParameterName = "companyId";
companyIdParam.Direction = ParameterDirection.Input;
companyIdParam.DbType = DbType.Int32;
companyIdParam.Value = companyId;
command.Parameters.Add(companyIdParam);