Make typelib marshaler use IRpcChannelBuffer::GetBuffer if possible.

diff --git a/dlls/oleaut32/tmarshal.c b/dlls/oleaut32/tmarshal.c
index eded5c6..cf82a31 100644
--- a/dlls/oleaut32/tmarshal.c
+++ b/dlls/oleaut32/tmarshal.c
@@ -2214,11 +2214,34 @@
 	return hres;
 
     ITypeInfo_Release(tinfo);
+    HeapFree(GetProcessHeap(), 0, args);
+
     xmsg->cbBuffer	= buf.curoff;
-    I_RpcGetBuffer((RPC_MESSAGE *)xmsg);
-    memcpy(xmsg->Buffer, buf.base, buf.curoff);
-    HeapFree(GetProcessHeap(),0,args);
-    return S_OK;
+    if (rpcchanbuf)
+    {
+        hres = IRpcChannelBuffer_GetBuffer(rpcchanbuf, xmsg, &This->iid);
+        if (hres != S_OK)
+            ERR("IRpcChannelBuffer_GetBuffer failed with error 0x%08lx\n", hres);
+    }
+    else
+    {
+        /* FIXME: remove this case when we start sending an IRpcChannelBuffer
+         * object with builtin OLE */
+        RPC_STATUS status = I_RpcGetBuffer((RPC_MESSAGE *)xmsg);
+        if (status != RPC_S_OK)
+        {
+            ERR("I_RpcGetBuffer failed with error %ld\n", status);
+            hres = E_FAIL;
+        }
+    }
+
+    if (hres == S_OK)
+        memcpy(xmsg->Buffer, buf.base, buf.curoff);
+
+    HeapFree(GetProcessHeap(), 0, buf.base);
+
+    TRACE("returning\n");
+    return hres;
 }
 
 static LPRPCSTUBBUFFER WINAPI
@@ -2231,6 +2254,7 @@
 TMStubImpl_CountRefs(LPRPCSTUBBUFFER iface) {
     TMStubImpl *This = (TMStubImpl *)iface;
 
+    FIXME("()\n");
     return This->ref; /*FIXME? */
 }