![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Всем добрый день. Есть некая библиотека, написанная на C++. Она компилится в DLL. Мне нужно написать на Delphi заголовочный файл для работы с этой библиотекой. Функций там не много и я их перевел без трудностей кроме одной. Также есть заголовочный файл для C#. Конкретно интерисует, как правильно описать функцию FFQLAY_start и ее второй параметр char **argv
Експорт из С++: Код:
__declspec (dllexport) int FFQLAY_start(int argc, char **argv, HWND hwndParent, int width, int height); Заголовочный файл C#: Код:
using System; using System.Text; using System.Runtime.InteropServices; namespace ffqlayDemo { /// <summary> /// Summary description for FLVPlayerLib. /// </summary> public class FFQlay { public enum PlayState {None, Playing, Paused, Abort, Stopped}; // [DllImport("ffqlay.dll")] public static extern int FFQLAY_start(int argc, [MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.LPStr)] IntPtr[] argv, IntPtr hwndParent, int width, int height); [DllImport("ffqlay.dll")] public static extern int FFQLAY_pause(); [DllImport("ffqlay.dll")] public static extern int FFQLAY_stop(); [DllImport("ffqlay.dll")] public static extern double FFQLAY_get_duration(); [DllImport("ffqlay.dll")] public static extern double FFQLAY_get_position(); [DllImport("ffqlay.dll")] public static extern int FFQLAY_set_position(double position); [DllImport("ffqlay.dll")] public static extern int FFQLAY_resize(int width, int height); [DllImport("ffqlay.dll")] public static extern int FFQLAY_get_play_state(); [DllImport("ffqlay.dll")] public static extern int FFQLAY_get_volume(); [DllImport("ffqlay.dll")] public static extern int FFQLAY_set_volume(int volume); // public static void FFQLAY_start(string fileName, IntPtr hwndParent, int width, int height) { IntPtr[] argv = new IntPtr[2]; argv[0] = Marshal.StringToHGlobalAnsi("ffqlay.exe"); argv[1] = Marshal.StringToHGlobalAnsi(fileName); FFQLAY_start(2, argv, hwndParent, width, height); Marshal.FreeHGlobal(argv[0]); Marshal.FreeHGlobal(argv[1]); } } } Заголовочный файл, что получился у меня, но при вызове функции FFQLAY_play вылетает ошибка Access Violation на строчке args[0] := PAnsiChar('ffqlay.exe');: Код:
unit FFQlay; interface uses Windows; type PArgs = ^TArgsArr; TArgsArr = array [0..1] of pchar; const FFQLayDLL = 'ffqlay.dll'; var args: PArgs; function FFQLAY_start(argc: integer; argv: PArgs; wndHandle: DWORD; width: integer; height: integer): integer; stdcall; external FFQLayDLL; function FFQLAY_pause: integer; stdcall; external FFQLayDLL; function FFQLAY_stop: integer; stdcall; external FFQLayDLL; function FFQLAY_get_duration: double; stdcall; external FFQLayDLL; function FFQLAY_get_position: double; stdcall; external FFQLayDLL; function FFQLAY_set_position(position: double): integer; stdcall; external FFQLayDLL; function FFQLAY_resize(width, height: integer): integer; stdcall; external FFQLayDLL; function FFQLAY_get_play_state: integer; stdcall; external FFQLayDLL; function FFQLAY_get_volume: integer; stdcall; external FFQLayDLL; function FFQLAY_set_volume(volume: integer): integer; stdcall; external FFQLayDLL; function FFQLAY_play(fileName: string; hwndParent: HWND; width: integer; height: integer): integer; implementation function FFQLAY_play(fileName: string; hwndParent: HWND; width: integer; height: integer): integer; begin args[0] := PAnsiChar('ffqlay.exe'); args[1] := PAnsiChar(fileName); FFQLAY_start(2, args, hwndParent, width, height); Result := 1; end; end. Подскажите, что я не так делаю. |
#2
|
|||
|
|||
![]() |