2016-08-21 4 views
1

Я пытаюсь более двух дней, чтобы получить изображение JPEG и MP4 Video File Information с помощью MediaInfo.DLL в моем скрипте Pascal.Получить изображение с помощью библиотеки MediaInfo в Inno Setup Pascal Script

Но я получаю ошибку

Runtime Error (в 6: 366) - Нарушение прав доступа по адресу 0042FD23. Читайте адрес 8065241E. '

Ошибка в основном указывает на (при 6: 366).

Я не могу думать, что проблема вызывает это исключение при попытке получить информацию СМИ с помощью MediaInfo.DLL.

Кода я добавил к моему сценарию:

[Files] 
Source: Lamborghini_Aventador.jpg; DestDir: {tmp}; Flags: dontcopy 
Source: MediaInfo.dll; DestDir: {tmp}; Flags: dontcopy 

[Code] 
#ifdef UNICODE 
type 
    PWideChar = WideString; 
#endif 

const 
    StreamKind_Image = 5; 
    InfoKind_Text = 1; 

function MediaInfo_New: Cardinal; 
    external '[email protected]{tmp}\MediaInfo.dll stdcall delayload'; 
function MediaInfo_Open(Handle: Cardinal; File__: PWideChar): Boolean; 
    external '[email protected]{tmp}\MediaInfo.dll stdcall delayload'; 
function MediaInfo_Get(Handle: Cardinal; StreamKind: Integer; StreamNumber: Integer; Parameter: PWideChar; KindOfInfo: Integer; KindOfSearch: Integer): PWideChar; 
    external '[email protected]{tmp}\MediaInfo.dll stdcall delayload'; 

procedure RetrieveImageInformation; 
var 
    IHandle: Cardinal; 
    Width: PWideChar; 
begin 
    ExtractTemporaryFile('Lamborghini_Aventador.jpg'); 
    ExtractTemporaryFile('MediaInfo.dll'); 
    IHandle := MediaInfo_New(); 
    MediaInfo_Open(IHandle, PWideChar(ExpandConstant('{tmp}\Lamborghini_Aventador.jpg'))); 
    Width := MediaInfo_Get(IHandle, StreamKind_Image, 0, 'Width', InfoKind_Text, 0); 
    Log('Width of the JPEG Image: ' + PWideChar(Width) + '.'); 
end; 

Линии, исключение составляет порождающий :

Width := MediaInfo_Get(IHandle, StreamKind_Image, 0, 'Width', InfoKind_Text, 0); 

Я ожидал, что выход компилятор будет Width of the JPEG Image: 1920.

Я использую последнюю версию Unicode Inno Setup Compiler (5.5.9 - U)

Заранее благодарим за вашу важную помощь.

+0

Где вы получили эти DLL-вызовы для 'MediaInfo.DLL'? Получены ли они из примера Delphi с ним? – GTAVLover

+0

Да @GTAVLover ......... Я думаю, что они в порядке ....... Ваша рекомендация тоже прекрасна ....... Только то, что я хочу, это получить CMD Output через 'LoadStringFromFile '.:-) – Blueeyes789

ответ

1

Вы можете использовать MediaInfo Command Line Interface с Inno Setup Ansi или Unicode Version.

Пример использования:

[Files] 
Source: MediaInfo.exe; DestDir: {tmp}; Flags: Dontcopy 

[code] 
function InitializeSetup(): Boolean; 
var 
    ErrorCode: Integer; 
begin 
    ExtractTemporaryFile('MediaInfo.exe'); 
    ShellExec('Open', 'MediaInfo.exe', ExpandConstant('"YourFileName.mp4" --LogFile="YourFileName Prperties.log"'), ExpandConstant('{tmp}'), SW_HIDE, ewWaitUntilTerminated, ErrorCode); 
    if SysErrorMessage(DLLGetLastError) = SysErrorMessage(0) then 
    Result := True; 
end; 

Теперь перейдите к установке Inno Временный каталог в качестве администратора с помощью Run (Windows Key + R) Command и увидеть ваши СМИ информация файл журнала существует там, который содержит информацию о файле вы дали в Команде.

2

Я не думаю, что вы можете вызвать функцию, которая возвращает указатель на строку (символьный буфер) из Inno Setup Pascal Script.

Но вы можете взломать его так:

  • Объявить функцию, если она возвращает Cardinal;
  • Используйте некоторую доступную функцию, которая берет указатель и копирует его другому указателю. Объявите указатель источника как Cardinal и целевой указатель как string. Одной из таких функций является StrCpyN.
function MediaInfo_Get(
    Handle: Cardinal; StreamKind: Integer; StreamNumber: Integer; 
    Parameter: string; KindOfInfo: Integer; KindOfSearch: Integer): Cardinal; 
    external '[email protected]{tmp}\MediaInfo.dll stdcall delayload'; 

function StrCpyN(S1: string; S2: Cardinal; Max: Cardinal): Cardinal; 
    external '[email protected] stdcall'; 
var 
    P: Cardinal; 
    S: string; 
begin 
    P := MediaInfo_Get(IHandle, StreamKind_Image, 0, 'Width', InfoKind_Text, InfoKind_Name); 
    S := StringOfChar(' ', 1024); 
    StrCpyN(S, P, Length(S) - 1); 
    S := Trim(S); 
    ... 
end; 

код требует установки Unicode Inno.

+0

Это тоже хороший вариант, но сложный и простой ....... ;-) – GTAVLover

+0

Кажется немного сложным, как я могу объявить 'StrCpyN'? – Blueeyes789

+0

Извините, я забыл объявление 'StrCpyN'. Добавлено сейчас. –

Смежные вопросы