Форум по 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



Експорт из С++:
Код:
1
__declspec (dllexport) int FFQLAY_start(int argc, char **argv, HWND hwndParent, int width, int height);

Заголовочный файл C#:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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');:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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, время: 23:56.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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