+ int len = s.Length;
+ IntPtr ctm = AllocCoTaskMem ((len+1) * 2 + 4);
+ byte [] buffer = null;
+ WriteInt32 (ctm, 0, len*2);
+ try {
+ buffer = s.GetBuffer ();
+
+ for (int i = 0; i < len; i++)
+ WriteInt16 (ctm, 4 + (i * 2), (short) ((buffer [(i*2)] << 8) | (buffer [i*2+1])));
+ WriteInt16 (ctm, 4 + buffer.Length, 0);
+ } finally {
+ if (buffer != null)
+ for (int i = buffer.Length; i > 0; ){
+ i--;
+ buffer [i] = 0;
+ }
+ }
+ return (IntPtr) ((long)ctm + 4);