[Mono-dev] BSTR Marshalling in Mono

Jonathan Chambers joncham at gmail.com
Fri Jan 25 09:50:21 EST 2008


Paolo,
     Thanks for the reviews. I just hardcoded the functions for now, and did
the cleanup you requested.

Thanks,
Jonathan

On Jan 11, 2008 1:03 PM, Paolo Molaro <lupus at ximian.com> wrote:

> On 01/08/08 Jonathan Chambers wrote:
> >      Here is the first attempt at a patch. Nothing is changed with the
> > default configuration. Things are controlled via an environment variable
> > (MONO_COM), and extensible using the dllmap in the config file. The only
> > other current configuration is MONO_MS, which supports Mainsoft COM
> > components. If this looks acceptable, I will cleanup any issues and
> document
> > the environment variable.
>
> Since we hardcode the functions, I wonder if this should really be
> configurable.
>
> > Index: metadata/loader.h
> > ===================================================================
> > --- metadata/loader.h (revision 92458)
> > +++ metadata/loader.h (working copy)
> > @@ -62,6 +62,9 @@
> >  void
> >  mono_dllmap_insert (MonoImage *assembly, const char *dll, const char
> *func, const char *tdll, const char *tfunc);
> >
> > +int
> > +mono_dllmap_lookup (MonoImage *assembly, const char *dll, const char*
> func, const char **rdll, const char **rfunc);
>
> IIF we expose this, it should be a MONO_INTERNAL function in a private
> header.
>
> > Index: metadata/marshal.c
> > ===================================================================
> > --- metadata/marshal.c        (revision 92458)
> > +++ metadata/marshal.c        (working copy)
> >  mono_string_to_bstr (MonoString *string_obj)
> >  {
> > @@ -1082,19 +1094,60 @@
> >               return NULL;
> >       return SysAllocStringLen (mono_string_chars (string_obj),
> mono_string_length (string_obj));
> >  #else
> > -     int slen = mono_string_length (string_obj);
> > -     char *ret = g_malloc (slen * 2 + 4 + 2);
> > -     if (ret == NULL)
> > -             return NULL;
> > -     memcpy (ret + 4, mono_string_chars (string_obj), slen * 2);
> > -     * ((guint32 *) ret) = slen * 2;
> > -     ret [4 + slen * 2] = 0;
> > -     ret [5 + slen * 2] = 0;
> > +     if (com_provider == MONO_COM_DEFAULT) {
> > +             int slen = mono_string_length (string_obj);
> > +             char *ret = g_malloc (slen * 2 + 4 + 2);
> > +             if (ret == NULL)
> > +                     return NULL;
> > +             memcpy (ret + 4, mono_string_chars (string_obj), slen *
> 2);
> > +             * ((guint32 *) ret) = slen;
> > +             ret [4 + slen * 2] = 0;
> > +             ret [5 + slen * 2] = 0;
> >
> > -     return ret + 4;
> > +             return ret + 4;
> > +     }
> > +     else if (com_provider == MONO_COM_MS) {
>
> The else goes into the same line as the closing }.
>
> > +             char *error_msg;
> > +             gpointer ret = NULL;
> > +             gunichar* str = NULL;
> > +             guint32 len;
> > +             MonoDl *module = NULL;
> > +             SysAllocStringLenFunc pSysAllocString = NULL;
> > +             const char* scope = "liboleaut32.so";
> > +             const char* import = "SysAllocStringLen";
> > +             const char* new_scope = NULL;
> > +             const char* new_import = NULL;
> > +             if (mono_dllmap_lookup (mono_defaults.corlib, scope,
> import, &new_scope, &new_import)) {
> > +                     scope = new_scope;
> > +                     import = new_import;
> > +             }
> > +             module = mono_dl_open(scope, MONO_DL_LAZY, &error_msg);
> > +             if (error_msg) {
> > +                     g_warning ("Error loading COM support library
> '%s': %s", scope, error_msg);
> > +                     g_assert_not_reached ();
> > +                     return NULL;
> > +             }
> > +             error_msg = mono_dl_symbol (module, import,
> (gpointer*)&pSysAllocString);
> > +             if (error_msg) {
> > +                     g_warning ("Error loading entry point '%s' in COM
> support library '%s': %s", import, scope, error_msg);
> > +                     g_assert_not_reached ();
> > +                     return NULL;
> > +             }
>
> Please put this code into its own function and share it with
> SysStringLen and SysFreeString: the tree lookups should be done at the
> same time.
> Thanks!
>
> lupus
>
> --
> -----------------------------------------------------------------
> lupus at debian.org                                     debian/rules
> lupus at ximian.com                             Monkeys do it better
> _______________________________________________
> Mono-devel-list mailing list
> Mono-devel-list at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-devel-list
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.ximian.com/pipermail/mono-devel-list/attachments/20080125/fd3708dc/attachment.html 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: bstr.diff
Type: text/x-diff
Size: 5777 bytes
Desc: not available
Url : http://lists.ximian.com/pipermail/mono-devel-list/attachments/20080125/fd3708dc/attachment.bin 


More information about the Mono-devel-list mailing list