Plateforme Level Extreme
Abonnement
Profil corporatif
Produits & Services
Support
Légal
English
Problem passing array to .NET COM
Message
Information générale
Forum:
Visual FoxPro
Catégorie:
COM/DCOM et OLE Automation
Versions des environnements
Visual FoxPro:
VFP 9 SP2
OS:
Windows 7
Divers
Thread ID:
01523745
Message ID:
01523940
Vues:
40
I doubt whether using CursorToXML on the VFP side would work with this approach - as per my example try building a simple list of your Contact objects and converting to XML. You can then examine the string that is produced (the easiest way is to use the XML Visulalizer in the debugger) which will show the XML format you will need to deal with in VFP. My simple Contact class would give:
<?xml version=\"1.0\" encoding=\"utf-16\"?>
<ArrayOfContact xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">
<Contact>
<Name>Fred</Name>
<Age>33</Age>
</Contact>
<Contact>
<Name>Joe</Name>
<Age>66</Age>
</Contact>
</ArrayOfContact>
Bear in mind this was only a suggestion. VFP Cursors and .NET Datatables would also work - but my approach would be more lightweight...

>Thank you for the informative response. I tried implementing it but failed when attempting to deserialize. Does the XML output from CURSORTOXML() need to look a certain way for the deserialization to work?
>
>Another thing to point out is that I'm only passing over three properties to populate for the Contact object (i.e. first/last name, email), whereas the Contact class has a lot more properties defined. Would the XML need to contain empty elements for the properties I'm not using?
>
>Thanks.
>
>Jon
>
>>Hi,
>>Sounds OK - but if you don't really need a datatable then if's very simple to use a generic list instead. A couple of generic methods will convert any list of objects to XML and back (assuming the objects themselves are serializable). e.g:
public static class Helper
>>    {
>>        public static List<T> RetrieveList<T>(string s)
>>        {
>>            XmlSerializer xs = new XmlSerializer(typeof(List<T>));
>>            System.Xml.XmlReader v = System.Xml.XmlReader.Create(new StringReader(s));
>>            return (List<T>)xs.Deserialize(v);
>>        }
>>
>>        public static string ConvertToXML<T>(List<T> list)
>>        {
>>            XmlSerializer xs = new XmlSerializer(typeof(List<T>));
>>            StringWriter sw = new StringWriter();
>>            xs.Serialize(sw, list);
>>            return sw.ToString();
>>        }
>>    }
Example use:
       List<Contact> list = new List<Contact>();
>>            list.Add(new Contact { Name = "Fred", Age = 33 });
>>            list.Add(new Contact { Name = "Joe", Age = 66 });
>>
>>            string xmlString = Helper.ConvertToXML<Contact>(list);
>>            //(Examine this string to determine what VFP should create)
>>
>>            List<Contact> retrievedList = Helper.RetrieveList<Contact>(xmlString);
>>>Thanks for the tip. In the meantime, I've decided to switch to sending XML and convert that to a DataTable that I can iterate through. That seems to do the trick for now.
>>>
>>>Jon
>>>
>>>>>My C# COM DLL has a public method with the following signature:
>>>>>
>>>>>public void AddClientsToList(Contact[] contacts, string listName)
>>>>>
>>>>>
>>>>>In VFP, I do the following:
  • Call a DLL method to get a new contact object
  • Populate the properties
  • Create an array and place the object in the first element
  • Call COMARRAY(loDLL,10)

>>>>>When I attempt loDLL.AddClientsToList(@MyArray, "test"), I get a type mismatch COM error.
>>>>>
>>>>>Any ideas on what I'm doing wrong?
>>>>
>>>>No. But passing arrays of anything is always a pain. Since you have control of both sides maybe it would be simpler to just pass the Contacts in one-by-one? e.g:
public class MyDll
>>>>    {
>>>>        Dictionary<string, List<Contact>> lists = new Dictionary<string, List<Contact>>();
>>>>        public Contact GetNewContact() { return new Contact();}
>>>>       
>>>>        public void AddClientToList(Contact contact,string listName)
>>>>        {
>>>>             if (!lists.Keys.Contains(listName))
>>>>                lists.Add(listName, new List<Contact>());
>>>>            lists[listName].Add(contact);
>>>>        }
>>>>    }
Précédent
Répondre
Fil
Voir

Click here to load this message in the networking platform