загружаем длл и передаем в функцию HWND
От: ranetka  
Дата: 08.10.05 13:37
Оценка:
есть 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.

перепробовала все варианты, пришедшие в голову по поводу того, что в функцию передавать. Результат один и тот же. Где ошибка? Что смотреть?
Re: загружаем длл и передаем в функцию HWND
От: Аноним  
Дата: 08.10.05 15:26
Оценка:
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.
Re: загружаем длл и передаем в функцию HWND
От: GlebZ Россия  
Дата: 08.10.05 20:51
Оценка:
Здравствуйте, ranetka, Вы писали:

Во первых все указатели на непонятные объекты(например стандартные виндовые) надо делать как IntPtr(это тебе и дает ошибку). Замени void* на IntPtr. Во вторых, pChar я сомневаюсь что они являются Unicode.

С уважением, Gleb.
Re: загружаем длл и передаем в функцию HWND
От: ranetka  
Дата: 09.10.05 00:22
Оценка:
сделала что советовали. ошибка не ушла. что значит pchar не юникод? чо с ним сделать тогда?
Re: загружаем длл и передаем в функцию HWND
От: GlebZ Россия  
Дата: 09.10.05 11:01
Оценка:
Здравствуйте, 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.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.