Visual Studio 2019でAviUtlプラグイン作成環境を作る場合

なんとなくのメモ、サンプルのプラグインを動かす分にはほとんど今までと変わらないはず

手順

  1. 「新しいプロジェクトの作成」あるいは「ファイル」→「新規作成」→「プロジェクト」
  2. 「dll」で検索すると「ダイナミック リンク ライブラリ(DLL)」が出るのでそれを選択
  3. 適当にプロジェクト名を設定し「作成」
  4. プロジェクト配下のソースフォルダにaviutl_plugin_sdk.zipを解凍したときのファイルをコピー(ここではfilter.h・video_filter.cpp・video_filter.defをコピー)
  5. ソリューションエクスプローラーから「ヘッダー ファイル」右クリック→「追加」→「既存の項目」からfilter.hを追加、同様に「ソース ファイル」にvideo_filter.cppを、リソースファイルにvideo_filter.defを追加

設定を変更する

  1. 「プロジェクト」→「プロパティ」からプロパティページを開く
  2. 「構成プロパティ」→「詳細」から「文字セット」を“設定なし”にする
  3. 「リンカ」→「全般」の出力ファイルの項にある$(TargetExt).aufとする*1
  4. 「リンカ」→「入力」から「追加の依存ファイル」にvfw32.libとmsacm32.libを追加

Releaseビルドにも同じように適用したい場合、プロパティの「構成」で「すべての構成」を選んでおきます。

デバッグしやすくする

  1. 「プロジェクト」→「プロパティ」→「構成プロパティ」→「デバッグ」から「コマンド」をaviutl.exe(までのパス名)にする
  2. 同じくプロパティから「ビルドイベント」→「ビルド後のイベント」の「コマンドライン」を次のようにする
copy $(TargetDir)$(TargetName).auf <aviutl.exeが存在するフォルダのパス名>$(TargetName).auf

デバッグの際はAviUtlを終了するなどしてデバッグをやめることができます。

ソースコードを修正する

このままではビルドに通らないのでfilter.hのFILTER_DLL構造体を修正し、メンバのTCHAR型をすべてconst TCHAR型とします。

参照

AviUtlのプラグインフィルタをデバッグ

Diary 2005-1

[Q&A] AviUtlのプラグインを自作したい - Qiita

*1:.aufはプラグインフィルタ用拡張子なのでプラグインの種類に応じて.auiや.aucなどにする

WSL2のDNSサーバーアドレスとX11の$DISPLAYを別にする

環境

既存の方法における問題

WSL2ではネットワーク構成が従来のWSL1と異なるため、X Window SystemGUIをホストOSのWindows上に表示させるといったケースでは、DISPLAY環境変数を(:0.0などから)変更する必要がありました。 その指定方法として、多くのサイトでは次のような設定が提示されていました。

export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0.0

上記の指定方法ではWSL2のネームサーバーとして、仮想ネットワーク上のホストOS(Windows)のローカルIPアドレスを指定しています。 しかしながら、この方法では/etc/resolv.confを参照しているため、DNSとして(GoogleやCloudflareなどといった)外部のDNSサーバーを指定することができません。

WSL2を使っているとDNSX11が参照するIPアドレスを分けたくなる場合があります。 そのための設定手順をまとめます。

注意

OSやディストリビューションの違いによってはうまく動作しないかもしれません。 動作しないようなら元に戻しておくことをお勧めします。

手順

  1. /etc/wsl.confを編集し、generateResolvConfをfalseにする
  2. Powershell/cmd上でwsl --shutdownを実行する
  3. WSL2を再起動しsudo unlink /etc/resolv.confシンボリックリンクを解除する
  4. /etc/resolv.confを作成(中身は"nameserver 1.1.1.1"など)し、2.と同様にWSL2を再起動する
  5. ~/.bashrcなどで指定されているDISPLAY環境変数を次のように変更する*1
    bash export DISPLAY=$(arp -a | sed -E "s/.*\((.+)\).*/\1/"):0.0

    bash export DISPLAY=$(ip route show 0.0.0.0/0 | awk '{print $3}'):0.0

  6. WSL2にログインしなおし、DNSサーバーとDISPLAY環境変数の設定が問題ないことを確認する

参照

github.com

zuntan02.hateblo.jp

Fix DNS resolution in WSL2 · GitHub

*1:ホストOSにあたるゲートウェイを指定したいので下の方が良さそうです

qpdfで暗号化保護解除がうまくいかないとき

qpdfとはpdfファイルの変換などを行ってくれる便利ツールです。 その機能の一つに暗号化処理で保護されたpdfファイルのパスワードを解除してくれるものがあります。使い方としては以下のような具合(詳しい説明は省きます)↓

$ qpdf --decrypt $input_file --password=$password $output_file.pdf

しかしながら一部のpdfファイルでは、この方法を実行すると以下のようなログとともに破損した出力ファイルが生成されます。

qpdf: integer out of range converting 4040556602 from a 8-byte unsigned type to a 4-byte signed type

パスワードは正しいため出力ファイルそのものは生成されていますが実体の出力はできていません。

f:id:Stearin:20210208140927p:plain
Adobe Acrobat Reader DCで開こうとしても失敗してしまう

私はWSL2を普段使っていますがaptにおいてインストールされるqpdfのバージョンUbuntu 20.04の場合9.1.1までのようです。 githubのissueを確認したところでは10.0.4で修正されているようなので最新バージョンである10.1.0をビルドして解決しました。 ビルドにはlibjpegが必要になるのでそれもあわせて導入しました。

$ wget https://www.ijg.org/files/jpegsrc.v9d.tar.gz
$ tar xvzf jpegsrc.v9d.tar.gz
$ cd jpeg-9d/
$ ./configure
$ make
$ sudo make install
$ git clone https://github.com/qpdf/qpdf
$ cd qpdf/
$ ./configure
$ make
$ sudo make install
$ echo "export LD_LIBRARY_PATH=/usr/local/lib" >> ~/.bashrc
$ qpdf --version
qpdf version 10.1.0
Run qpdf --copyright to see copyright and license information.

バージョンが表示されれば正しくビルドできています。

参考

daeudaeu.com

github.com

github.com