2010-08-06 2 views
0

У меня есть сценарий Microsoft Powershell, который проверяет все файлы в сложенном конце в .wtv (Windows Media Center, записанные телевизионные программы), извлекает некоторые метаданные (с использованием DLL под названием «Toub.MediaCenter.Dvrms.dll»), а затем записывает его на стандартный вывод:Использование Win32 :: API для доступа к методам DLL в Perl

[void][System.Reflection.Assembly]::LoadFile("C:\Toub.MediaCenter.Dvrms.dll") 

# Get all files ending in .wtv 

foreach ($file in gci "*.wtv") 
{ 
    $wtv = New-Object Toub.Mediacenter.Dvrms.Metadata.DvrmsMetadataEditor($file) 
    $attrlist = $wtv.GetAttributes() 

    # Extract the Title and Description from the recorded programme 

    $t = $attrlist["Title"].value 
    $d = $attrlist["WM/SubTitleDescription"].value 

    # Print them to STDOUT 

    "$t" 
    "$d" 
} 

на данный момент, я запускаю это из сценария Perl, а затем анализировать результаты. Это работает, но беспорядочно, и я хотел бы отказаться от части powershell и сделать это полностью в Perl.

Однако я совершенно не знаю, как ссылаться на DLL, так что я могу назвать GetAttributes метода на файл, а затем извлечь значения из Названия и WM/SubTitleDescription.

Я указал на использование Win32 :: API, но я понятия не имею, какое имя библиотеки, из которой я хочу импортировать функцию, и не знаю прототип функции C.

Таким образом, мой код останавливается, потому что я не уверен, что я должен делать с Win32 :: API. Мой (очень простой) окурка выглядит следующим образом:

use Win32::API; 

foreach my $file (glob("*.wtv")) 
{ 
    my $wtv = new Win32::API(...stuck here...); 

    # Complete guesswork from here on... 

    print $wtv->GetAttributes("Title") . "\n"; 
    print $wtv->GetAttributes("WM/SubTitleDescription") . "\n"; 
} 

Я предполагаю, что это, вероятно, очевидно, из Powershell выше того, что я должен положить в новый Win32 :: API линии и является ли или нет $ wtv-> GetAttributes верен - но, честно говоря, у меня нет подсказки.

Может кто-нибудь указать мне в правильном направлении?

+0

http://search.cpan.org/perldoc/Win32::API –

+0

Спасибо, но я уже прочитал эту документацию, и он говорит мне, что мне нужно знать имя библиотеки, из которой я хочу импортировать функция и прототип C функции, о которой я не знаю и, следовательно, вопрос. – Richard

ответ

1

Похоже, что сценарий оболочки питания загружает dll .net framework dll, а не C api dll, в котором он использует Toub.Mediacenter.Dvrms.Metadata.DvrmsMetadataEditor, скорее всего, определен там. Я знаю, что есть некоторая поддержка активного состояния для взаимодействия между жемчугом и .net.

Я не знаю, есть ли у вас значительная база кода perl, или если это было вашими знаниями, но силовая оболочка отлично справляется с вашими синтаксическими анализами, в этом направлении может быть проще.

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