Я пытаюсь вызвать нативный .dll из c # с помощью p / invoke. Я могу сделать вызов (без сбоев, функция возвращает значение), но код возврата указывает «Параметр указателя не указывает на доступную память». Я решил использовать метод проб и ошибок, чтобы решить эту проблему, но пока не достиг никакого прогресса.
Вот подпись нативной функции, которую я вызываю:
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
);
Вот импортированная подпись в 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
);
Вот определение C WFSVERSION:
typedef struct _wfsversion
{
WORD wVersion;
WORD wLowVersion;
WORD wHighVersion;
CHAR szDescription[257];
CHAR szSystemStatus[257];
} WFSVERSION, * LPWFSVERSION;
Вот определение CFS 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;
}
Вот вызов MyFunction из 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);
Как я уже сказал, этот вызов возвращается, но возвращаемым значением является код ошибки, указывающий: «Параметр указателя не указывает на доступную память». Я должен делать что-то не так с параметрами 1,3,7,8 или 9. Однако я сделал успешные вызовы других функций в этом .dll, которые требовали WFSVERSION * в качестве параметров, поэтому я не думаю, что параметры 7 или 8 проблема здесь.
Буду признателен за любые мысли о причине этой проблемы или за конструктивную критику моего кода. Это мой первый опыт работы с P / Invoke, поэтому я не уверен, с чего начать. Можно ли как-то сузить проблему или пробная версия - это единственный вариант?