Hej, Jag tror med betoning på TROR att du inte ska skicka en stringbuilder. Testa med en string, eller kanske snarare en char[]. Du kan skicka en StringBuilder, MEN din sista parameter kommer att vara ett värde som visar hur många tecken som API:t ändrade på. Därför bör det vara en "vanlig" int som du (mycket riktigt) initierar till 80 (maxkapaciteten på din StringBuilder). Alltså inte en Property på Din Stringbuilder.Anropa funktioner i extern DLL
Jag håller på att försöka använda SPCS eländiga API från C# men jag får inte till det på vissa funktioner med knepiga parametrar.
Funktionen är deklarerad såhär i .h filen till C++
__declspec(dllexport) ADK_ERROR __stdcall AdkGetStr(ADK_DATA* pData, INT iFieldId, CHAR** ppsValue, INT iLen);
Och jag importerar den till C# så här:
[DllImport("Adk.dll", EntryPoint="_AdkGetStr@16", CharSet=CharSet.Ansi)]
public static extern AdkError AdkGetStr(IntPtr pData, int iFieldId, [MarshalAs(UnmanagedType.LPStr)] ref StringBuilder val, int iLen);
Jag anropar den med följande C# kod:
StringBuilder val = new StringBuilder(80);
error = AdkGetStr(pData, ADK_ARTICLE_NAME, ref val, val.Capacity);
s = val.ToString();
Efter anropet ändras Capacity på val till 16 och längre strängar blir avhuggna, ibland kastas en exception 'System.ArgumentOutOfRangeException'.
Jag måste ha fel på MarshalAs, jag är inte på det klara med vad detta egentligen gör och hur pekar-pekaren som skickas iväg egentligen ser ut, kan någon som är hemma på det här förklara? Jag hittar inga exempel på nätet där man skickar char**, bara char*
Tack på förhand!Sv: Anropa funktioner i extern DLL
//Mikael Sand
Dryg och krämig i mittenSv:Anropa funktioner i extern DLL
/micke