Edgar (and others).

I was not aware of this technique of calling the function *twice*, once to
request the required buffer size and once to request the actual characters.

Your explanation helped greatly.

> cmsGetProfileInfo has to be called twice:
> The first time you pass 0 (Buffer and BufferSize) and cmsGetProfileInfo is
calculating how much memory you have to allocate.
> Then you allocate the memory,
> and call it a second time (passing a pointer to the buffer, and the
calculated size in BufferSize).
> After you're done it's your last job to free this memory.

I also found help here, on msdn :

https://social.msdn.microsoft.com/Forums/vstudio/en-US/d5b655b8-2dde-48f7-9a
be-a0259e2cf08b/dllimport-correct-c-signature?forum=csharpgeneral

and here :

https://limbioliong.wordpress.com/2011/11/01/using-the-stringbuilder-in-unma
naged-api-calls/

Which completely explains the technique.

> Note: Language code and country code are char, i.e. not unicode.
> imho they should be marshaled as
> UnmanagedType.LPStr or UnmanagedType.AnsiBStr

I chose to use the Unicode route, after all.

When I tried with call signature :

[DllImport(@lcms2Path, CharSet = CharSet.Ansi)]
public extern static UInt32 cmsGetProfileInfo(
        IntPtr hProfile,
        uint Info,
        string languageCode,   
        string countryCode,     
        StringBuilder buffer,
        UInt32 bufferSize);

believe it or not, all I was getting in the buffer was "one" silly character
back, the first letter of the profile name.

When I switched to this code :

[DllImport(@lcms2Path, CharSet = CharSet.Unicode)]
public extern static UInt32 cmsGetProfileInfo(
        IntPtr hProfile,
                int InfoType,
                string languageCode,  
                string countryCode,
                [Out] StringBuilder buffer,  
                UInt32 bufferSize);

I got the whole profile name!

According to the above Wordpress link, an "alternative to using the CharSet
argument" is to use the MarshalAsAttribute with UnmanagedType.LPWStr as
argument :

[DllImport("TestDLL.dll", CallingConvention = CallingConvention.StdCall,
EntryPoint = "TestAPIUnicode")]
private static extern UInt32
TestAPIUnicodeUsingStringBuilder([MarshalAs(UnmanagedType.LPWStr)]StringBuil
der lpBuffer, UInt32 uiSize);

Vielen danke, Edgar!!! I'm going to have to take you to the next
OktoberFest!

/ Roger


------------------------------------------------------------------------------
Attend Shape: An AT&T Tech Expo July 15-16. Meet us at AT&T Park in San
Francisco, CA to explore cutting-edge tech and listen to tech luminaries
present their vision of the future. This family event has something for
everyone, including kids. Get more information and register today.
http://sdm.link/attshape
_______________________________________________
Lcms-user mailing list
Lcms-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/lcms-user

Reply via email to