Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Синтаксис
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.09.2009, 11:21
iFynk iFynk вне форума
Прохожий
 
Регистрация: 10.06.2009
Сообщения: 36
Репутация: 10
По умолчанию Помогите создать заголовочный файл для Dll

Всем добрый день. Есть некая библиотека, написанная на 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  
Старый 11.09.2009, 12:34
iFynk iFynk вне форума
Прохожий
 
Регистрация: 10.06.2009
Сообщения: 36
Репутация: 10
По умолчанию

Вот немного подправил, ошибка не вылетает, но что-то все равно не так. Функция вроде начинает выполнятся, но потом прога просто вылетает. Если запускать через IDE, то показывает ошибки и выкидывает на окно CPU. Что делать?

Вот ссылка на тестовый пример.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:51.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025