есть dll, которая поставляется вместе с неким девайсом, есть в ней функция, описанная как
function InitVideo(MainForm,
VideoControl,
FingerControl:HWND;
msg:pChar;
var buflen:integer;
DeviceList:pChar):integer;stdcall;
//MainForm - handle основного окна, где идет работа с видео,
//VideoControl - handle окна, где может отображаться видеосигнал
//FingerControl - handle окна, где будет отображаться склеенный палец
//msg - имя девайса для старта, буфер для сообщения об ошибке
//(если возвращается <>0), отвести не менее 1000 байт
//buflen:integer;DeviceList:pChar - возвращается список доступных девайсов если pch[0]=0
есть необходимость загрузить эту функцию в приложении на С#. Для этого делаю так:
[DllImport("GetVideo.dll", EntryPoint="InitVideo", SetLastError=true, CharSet=CharSet.Unicode, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]
public static extern unsafe int InitVideo(void* MainForm, void* VideoControl, void* FingerControl, String msg, int buflen, String devlist);
...
char[] msgA = new char[1024];
char[] devlistA = new char[1024];
String msg = new String(msgA);
String devlist = " "; ";
int err, buflen = 1024, width = 320, height = 240;
if (InitVideo(this.Handle.ToPointer(),pbImage.Handle.ToPointer(),pbImage.Handle.ToPointer(),msg,buflen,devlist)==0)
{//no errror
...
}
при вызове ругается, что
An unhandled exception of type 'System.NullReferenceException' occurred in fpdb_manager.exe
Additional information: Object reference not set to an instance of an object.
перепробовала все варианты, пришедшие в голову по поводу того, что в функцию передавать. Результат один и тот же. Где ошибка? Что смотреть?
R>перепробовала все варианты, пришедшие в голову по поводу того, что в функцию передавать. Результат один и тот же. Где ошибка? Что смотреть?
Вот это попробуй:
using System.Text;
using System.Runtime.InteropServices;
...
[DllImport("GetVideo.dll")]
public static extern int InitVideo(IntPtr MainFormHandle, IntPtr VideoControlHandle, IntPtr FingerControlHandle, StringBuilder msg, int buflen, StringBuilder devlist);
...
StringBuilder msg = new StringBuilder(1024);
StringBuilder devlist = new StringBuilder(1024);
int buflen = 1024;
if (InitVideo(this.Handle,pbImage.Handle,pbImage.Handle,msg,buflen,devlist)==0)
{
};
А смотреть:
Marshaling Data with Platform Invoke и в частности —
Marshaling Strings.
сделала что советовали. ошибка не ушла. что значит pchar не юникод? чо с ним сделать тогда?
Здравствуйте, ranetka, Вы писали:
R>R>function InitVideo(MainForm,
R> VideoControl,
R> FingerControl:HWND;
R> msg:pChar;
R> var buflen:integer;
R> DeviceList:pChar):integer;stdcall;
R>//MainForm - handle основного окна, где идет работа с видео,
R>//VideoControl - handle окна, где может отображаться видеосигнал
R>//FingerControl - handle окна, где будет отображаться склеенный палец
R>//msg - имя девайса для старта, буфер для сообщения об ошибке
R>//(если возвращается <>0), отвести не менее 1000 байт
R>//buflen:integer;DeviceList:pChar - возвращается список доступных девайсов если pch[0]=0
R>
Воспользуйся советом, и прочитай про Marshaling
А пока попробуй так,
[DllImport("GetVideo.dll")]
public static extern int InitVideo(IntPtr MainFormHandle, IntPtr VideoControlHandle, IntPtr FingerControlHandle, StringBuilder msg, ref int buflen, StringBuilder devlist);
Где-то так должно получиться.
С уважением, Gleb.