2010-11-11 22 views
4

J'essaie de passer une chaîne de C# à Delphi construit DLL. La DLL Delphi attend PChar.Passage de chaîne en tant que PChar de CSharp à Delphi DLL

est ici export Delphi

procedure DLL_Message(Location:PChar;AIntValue :integer);stdcall; 
external 'DLLTest.dll'; 

C# importation (dernier j'ai essayé, il y avait chaîne, char * chaîne ref ...)

[DllImport(
      "DLLTest.dll", 
      CallingConvention = CallingConvention.StdCall, 
      CharSet = CharSet.Ansi, 
      EntryPoint = "DLL_Message" 
     )] 
     public static extern void DLL_Message(IntPtr Location, int AIntValue); 

Je reçois valeur accès à la violation d'accès dans tout façon.

Existe-t-il une solution pour transmettre une valeur de chaîne en tant que PChar en C#? Essayez l'attribut MarshalAs qui vous permet de contrôler le type natif utilisé.

Répondre

4

Une liste des types se trouvent dans MSDN:

http://msdn.microsoft.com/de-de/library/system.runtime.interopservices.unmanagedtype.aspx

DllImport(
      "DLLTest.dll", 
      CallingConvention = CallingConvention.StdCall, 
      CharSet = CharSet.Ansi, 
      EntryPoint = "DLL_Message" 
     )] 
     public static extern void DLL_Message(
      [MarshalAs(UnmanagedType.LPStr)] string Location, 
      int AIntValue 
     ); 
+0

MarshalAs pas nécessaire ici. C'est le marshaling par défaut. De même pour les paramètres de l'attribut DllImport. Seul le nom de fichier est requis. –

+0

Etes-vous sûr de ça? N'est pas le UnmanagedType.LPWStr par défaut (UTF-16)? –

+1

Apparemment, il est BStr: http://msdn.microsoft.com/en-us/library/s9ts558h.aspx –