Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.09.2009, 14:33   #1
ifynk
 
Регистрация: 27.05.2009
Сообщений: 3
По умолчанию Помогите создать заголовочный файл для 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 прога просто вылетает без ошибок. если запускать через IDE, то вылетает ошибка Access Violation и перекидывает на окно CPU с ассемблерным кодом.
Код:
unit FFQlay;

interface

uses
  Windows;

type
  PArgs = ^TArgsArr;
  TArgsArr = array [0..1] of PChar;

const
  FFQLayDLL = 'ffqlay.dll';

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;
var
  args: PArgs;
  
begin
  Result := 1;
  
  getmem(args, SizeOF(PArgs));  
  args[0] := PAnsiChar('ffqlay.exe');
  args[1] := PAnsiChar(fileName);

  FFQLAY_start(2, @args, hwndParent, width, height);
  //freemem(args, 30);
end;

end.
Подскажите, что я не так делаю.
ifynk вне форума Ответить с цитированием
Старый 11.09.2009, 14:46   #2
Luke
Пользователь
 
Аватар для Luke
 
Регистрация: 12.10.2007
Сообщений: 32
По умолчанию

Вообще не одна функа не вызывается? Если функи без параметров проходят на ОК, то неверное преобразование типов.
Из си программ выхов нормальный?
Si vis pacem, para bellum!
Luke вне форума Ответить с цитированием
Старый 11.09.2009, 14:59   #3
ifynk
 
Регистрация: 27.05.2009
Сообщений: 3
По умолчанию

Врапер на C# отрабатывает нормально. Параметры то в функцию FFQLAY_start передаются и вроде как что-то начинает работать, но потом тупо вылетает.

Вот тестовый проект.

ifynk вне форума Ответить с цитированием
Старый 11.09.2009, 17:06   #4
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Код:
function FFQLAY_play(fileName: string; hwndParent: HWND; width: integer; height: integer): integer;
var
  args: PArgs;
  name1,name2: array[0..260] of char;
begin
  Result := 1;
  new(args);
  StrCopy(name1, pchar('ffqlay.exe'));
  StrCopy(name2, pchar(fileName));
  args[0] := name1;
  args[1] := name2;
  FFQLAY_start(2, args, hwndParent, width, height);
  dispose(args);
end;
пыщь
JTG вне форума Ответить с цитированием
Старый 11.09.2009, 17:15   #5
ifynk
 
Регистрация: 27.05.2009
Сообщений: 3
По умолчанию

Спасибо большое, работает. Вы - гений.
ifynk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создать ini-файл с помощью dll bush007 Помощь студентам 35 08.09.2009 22:47
Как создать в Дeлфи класс в DLL для использования его в VC++ Dmitriy.Ch Общие вопросы Delphi 0 25.07.2009 08:40
заголовочный файл и файл исходного текста Роман Радер Общие вопросы C/C++ 10 21.07.2009 21:46
Нужно создать dll для защиты o_nix Фриланс 3 31.10.2008 15:06
Пытаюсь создать Dll для своей проги Parcenson Общие вопросы Delphi 6 30.09.2008 20:36