Всем добрый день. Есть некая библиотека, написанная на 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.
Подскажите, что я не так делаю.