Avatar billede lyhr007 Nybegynder
21. april 2004 - 14:32 Der er 4 kommentarer

Interop: Marshaling af object til COM Variant?

I VS 2003 har jeg lavet en COM wrapper til en COM dll.

I denne COM dll findes en Sub der har signaturen:
    Sub Assign(ByVal FieldData As Variant)

I min managed dll (som VS har lavet) giver det følgende metode:
    public void Assign(ref object FieldData)

Mit problem er at Variant kan være flere forskellige typer (f.esk Integer, string, boolean osv.). Lige meget hvad jeg sender med som object (også noget som jeg har fået retur fra COM, og sender tilbage igen), giver en COMException og jeg får en fejl med typeuoverensstemmelse.

Hvordan kan jeg marshale mit object som f.esk. en boolean, når det sendes fra managed code til COM???


BTW: Den modsatte vej virker fint, altså hvis jeg bruger COM dll'ens Get og så for en variant tilbage, der i managed code er et object, som jeg så kan type caste til f.esk. en bool (eller string, integer osv.).
Avatar billede burningice Nybegynder
21. april 2004 - 18:10 #1
må jeg se noget kode til hvordan du kalder Assign-metoden?
Avatar billede lyhr007 Nybegynder
22. april 2004 - 08:37 #2
// Simplified version!

            //Creates a new instance of the COM
            COMClass comClass = new COMClass();
           
            //Opens a storage
            comClass.Open(@"C:\file.bin");
           
            //Gets a variant(in .NET -> object) from the storage
            //It can be of several different types (bool, string, int etc.)
            object o = comClass.Get(1);
            //If I know it is a bool(there is a GetType Method)
            bool b = (bool)o; /*WORKS!*/
            b = false; /* WORKS*/

            //Assign a variant back to the storage.
            //Fails, even if it is the value from Get and it has not been modifed.
            comClass.AssignField(1, ref o);
Avatar billede wisen Nybegynder
29. juli 2004 - 08:32 #3
Ifølge følgende link skal du benytte [MarshalAs(UnmanagedType.Struct)] :
http://blogs.msdn.com/adam_nathan/archive/2003/04/24/56642.aspx

..prøv også at kigge på Marshal.GetObjectForNativeVariant og Marshal.GetNativeVariantForObject
Avatar billede wisen Nybegynder
11. november 2004 - 10:17 #4
Har du fået det til at du ?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester