Avatar billede troelsmn Nybegynder
21. maj 2008 - 14:17 Der er 5 kommentarer og
1 løsning

Hvordan læser jeg en char* fra en C++ DLL?

Jeg har en dll i c++, der returnerer en streng, men når jeg læser den i c# får jeg blot nogle firkanter ud og et k.

Min kode i c++:
extern "C" DLL_API char* CALL_CONV test(void){
  return("helloworld");
}

Min kode i c#:
[DllImport("TheDll", CharSet = CharSet.Auto)]
private static extern string test();

Jeg gik ud fra at det var fordi c# ikke kunne finde ud af det fordi det er en pointer. Derfor prøvede jeg System.String og System.Text.StringBuilder, men det gav samme resultat.

Nogle gode forslag?
Avatar billede pidgeot Nybegynder
21. maj 2008 - 14:27 #1
Prøv at angive CharSet.Ansi i stedet for CharSet.Auto. Jeg har på fornemmelsen at din C++ DLL ikke bruger Unicode.
Avatar billede troelsmn Nybegynder
21. maj 2008 - 14:38 #2
Yes det virker! \o/

Det kan være du også kan svare mig på om det er muligt at returnere structs?
Der får jeg en MarshalDirectiveException: "Metodens typesignatur er ikke kompatibel med PInvoke".

I C++:
struct UserL{
      char* username;
      char* password;
};
extern "C" DLL_API UserL CALL_CONV getUserLogin(){
      UserL user;
      user.username = "test";
      user.password = "kk";
      return(user);
}

I C#:
struct UserL
{
    public string username;
    public string password;
};
[DllImport("TheDll", CharSet = CharSet.Auto)]
private static extern UserL getUserLogin();
Avatar billede pidgeot Nybegynder
21. maj 2008 - 14:46 #3
Jeg er ikke ekspert i PInvoke, men http://msdn.microsoft.com/en-us/library/ef4c3t39.aspx tyder på du skal have et par attributter på structen i C#:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
struct UserL
{
    public string username;
    public string password;
};

Samtidigt skal du nok også bruge CharSet.Ansi der hvor du importerer metoden.
Avatar billede troelsmn Nybegynder
21. maj 2008 - 14:47 #4
Ok så vil jeg læse lidt videre der. Mange tak for hjælpen.
Avatar billede martinbk Nybegynder
21. maj 2008 - 14:52 #5
[DllImport("DinDll.dll", EntryPoint = "DinMetode")]
public static extern IntPtr DinMetode();

public static string GetString()
{
  return Marshal.PtrToStringAuto(DinMetode());
}

det skulle kunne klare det

din C++ metode retunerer jo en pointer og ikke en streng i den forstand, en pegepind til hukommelse, den statiske Marshal class har en række metoder til at trække data ud af unmanaged memory.
Avatar billede troelsmn Nybegynder
22. maj 2008 - 08:39 #6
Nice. Takker
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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