c# p/invoke Schwierigkeiten marshalling Zeiger

Ich bin versucht zu rufen, in eine native .dll aus c# mit p/invoke. Ich bin in der Lage, um den Anruf zu machen (kein Absturz, der Funktion einen Wert zurückgibt), aber der return-code bedeutet "Ein-Zeiger-parameter nicht zugänglich Gedächtnis." Ich habe gegriffen zu Versuch und Irrtum um dieses Problem zu lösen, aber ich habe nicht alle Fortschritte so weit.

Hier ist die Signatur der nativen Funktion rufe ich:

LONG extern WINAPI MyFunction ( LPSTR lpszLogicalName, //input
                                   HANDLE hApp,           //input  
                                   LPSTR lpszAppID,       //input 
                                   DWORD dwTraceLevel,    //input
                                   DWORD dwTimeOut,       //input
                                   DWORD dwSrvcVersionsRequired, //input
                                   LPWFSVERSION lpSrvcVersion, //WFSVERSION*, output
                                   LPWFSVERSION lpSPIVersion,  //WFSVERSION*, output
                                   LPHSERVICE lphService       //unsigned short*, output
                                 );

Hier ist die importierte Signatur in C#:

 [DllImport("my.dll")]
 public static extern int MyFunction( [MarshalAs(UnmanagedType.LPStr)] 
                                      string logicalName, 
                                      IntPtr hApp, 
                                      [MarshalAs(UnmanagedType.LPStr)] 
                                      string appID, 
                                      int traceLevel, 
                                      int timeout, 
                                      int srvcVersionsRequired, 
                                      [Out] WFSVersion srvcVersion, 
                                      [Out] WFSVersion spiVersion,
                                      [Out] UInt16 hService
                                    );

Hier ist die C-definition der WFSVERSION:

typedef struct _wfsversion
{
    WORD            wVersion;
    WORD            wLowVersion;
    WORD            wHighVersion;
    CHAR            szDescription[257];
    CHAR            szSystemStatus[257];
} WFSVERSION, * LPWFSVERSION;

Hier ist das C# definition der WFSVersion:

[StructLayout(LayoutKind.Sequential)]
public class WFSVersion
{
    public Int16 wVersion;
    public Int16 wLowVersion;
    public Int16 wHighVersion;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 257)]
    public char[] szDescription;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 257)]
    public char[] szSystemStatus;
}

Hier ist der Aufruf von MyFunction von C#:

WFSVersion srvcVersionInfo = new WFSVersion();
WFSVersion spiVersionInfo = new WFSVersion();


 UInt16 hService = 0;
 IntPtr hApp = IntPtr.Zero;
 string logicalServiceName = tbServiceName.Text;
 int openResult = MyFunction(logicalServiceName, hApp, null, 0,  
                              XFSConstants.WFS_INDEFINITE_WAIT,
                              0x00000004, srvcVersionInfo, spiVersionInfo, 
                              hService);

Wie gesagt, dieser Aufruf gibt, aber der Rückgabewert ist ein Fehlercode, der angibt, "Einen Zeiger-parameter nicht zugänglich Gedächtnis." Ich muss etwas falsch mit Parameter 1,3,7,8, oder 9. Allerdings hab ich gemacht, erfolgreiche Gespräche, um weitere Funktionen in diesem .dll, die erforderlich WFSVERSION* als Parameter, also ich glaube nicht, Parameter 7 oder 8 sind das Problem hier.

Ich würde schätzen alle Gedanken, die Sie möglicherweise über die Ursache dieses Problems, oder jede Konstruktive Kritik an meinem code. Dies ist meine erste Erfahrung mit P/Invoke, also ich bin mir nicht sicher, wo zu beginnen. Gibt es eine Möglichkeit, um das Problem einzugrenzen, oder Versuch ein Fehler meine einzige option?

  • pinvoke.net kann hilfreich sein
  • Sie haben einen null-Zeiger im Dritten argument - ist, dass der richtige code?
  • Ja, ein null-Zeiger ist gültig als drittes argument.
InformationsquelleAutor Odrade | 2009-06-02
Schreibe einen Kommentar