使用Win32 :: API访问Perl中DLL的方法

时间:2010-08-06 13:21:03

标签: perl api winapi powershell metadata

我拥有一个Microsoft Powershell脚本,该脚本检查.wtv(Windows Media Center录制的电视节目)折叠结尾的所有文件,提取一些元数据(使用名为“Toub.MediaCenter.Dvrms.dll”的DLL) )然后将其写入stdout:

[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 是正确的 - 但说实话,我没有线索。

有人可以指出我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

看起来power shell脚本正在加载.net框架dll而不是C api dll它使用的类Toub.Mediacenter.Dvrms.Metadata.DvrmsMetadataEditor最有可能在那里定义。我知道有一些来自活跃状态的支持,以实现pearl和.net之间的互操作性。

我不知道你是否拥有重要的perl代码库,或者你的知识是否存在,但是power shell完全能够处理你的解析需求,可能更容易朝着那个方向前进。