It really depends on the implementation of GetSynonymList in the dll. In general, though, there is no automatic conversion of an array of strings built in to Xojo to help you. You’re going to have to get an amorphous chunk of memory back from the dll and pick out the contents yourself.
You will need to pass a MemoryBlock to the first parameter, not a string or array of strings. Passing a string to the second parameter is correct, as Xojo does do an automatic conversion from String to CString when passing data TO the dll (it does not do an automatic conversion when getting data back from the dll).
The first consideration will be, Who is responsible for allocating the memory for the array of strings? It can go either way. MS tends to require the caller to allocate the memory (so that he will be responsible for freeing the memory - it’s just cleaner if the caller is responsible for both ends of the memory management). In that scenario, you first call the dll with a nil synonyms parameter and it responds with the amount of memory that would be required if it ran the query using your word. I’m guessing that’s not the way your call is set up. The alternative would be that the caller allocates a “sufficiently large” block of memory and passes that to the dll. The dll would return an error if the block were not large enough.
The other scenario is where the dll itself allocates the memory. It would usually also provide another call to free that memory.
So, in your dll, who allocates the memory? And who is responsible for freeing it?
Typically, an array of strings in a C type layout will be formatted as a block of pointers followed by the data being pointed to. So if you had 3 strings returned, you would have 3 4-byte values at the beginning of the block of memory. The 12th byte would be the beginning of the first CString and run for the length of the string plus a null byte. The next byte following that run of bytes would be the start of the next string, etc.
Occasionally, a dll call will return an array of references to static strings (a list of device names, for example) that don’t need to be allocated or freed, since they are part of the OS data. The documentation for the dll call will make this clear. In that case, you’ll get a block of memory that contains just the 4-byte pointers. That block will need to be allocated/freed, but the strings it points to won’t.
The short answer to your question is, you’ve gone beyond the automatic conversions that Xojo can provide and need to deal with the specifics of the data layout that your dll uses.