Skip to content

Conversation

@kumrnm
Copy link

@kumrnm kumrnm commented Apr 23, 2022

本リクエストでは、拡張編集の内部変数の情報(型とオフセットアドレス)をSDKに含めることを提案します。これにより、SDKとしての機能性が向上するのみならず、現状では各々のプロジェクトに分散している解析情報を本リポジトリに集約する効果が期待されます。

添付されているコードは設計の一案であり、試験的にAulsメモリ参照に含まれる変数情報を記載しています。想定される使用例は以下の通りです。

// 拡張編集 version0.92 のみに対応する例

#include <exedit.hpp>

extern unsigned int g_exedit_base;

void foo() {
	const auto objs = *ExEdit::Variables::get092<ExEdit::Variables::sortedObjectTable>(g_exedit_base);
	const auto n = *ExEdit::Variables::get092<ExEdit::Variables::sortedObjectTable::length>(g_exedit_base);

	// ...
}
// 拡張編集 version0.92 および 0.93rc1 に対応する例

#include <exedit.hpp>

extern unsigned int g_exedit_base;
extern ExEditVersion g_exedit_version;

template<typename Variable>
Variable::reference_type get_variable() {
	if (g_exedit_version == ExEditVersion::version092) {
		return ExEdit::Variables::get092<Variable>(g_exedit_base);
	}
	else if (g_exedit_version == ExEditVersion::version093rc1) {
		return ExEdit::Variables::get093rc1<Variable>(g_exedit_base);
	}
	else {
		return nullptr;
	}
}

void foo() {
	const auto objs = *get_variable<ExEdit::Variables::sortedObjectTable>();
	
	// この行はコンパイル不可(0.93rc1のオフセット情報が存在しないため)
	// const auto n = *get_variable<ExEdit::Variables::sortedObjectTable::length>();

	// ...
}

ご検討のほどよろしくお願い致します。

(2022/4/24 12:05追記)いくつかの誤りを修正しました

@ePi5131
Copy link
Owner

ePi5131 commented May 3, 2022

アドレスを書いてしまうの、あまりやりたくなかったことでした なんでなのかの言語化はちょっとまだできません
何か私が納得できる実装方法を思いついたら、それをやるかもしれません(逆に言えばこの実装は何かが嫌です)

@kumrnm
Copy link
Author

kumrnm commented May 3, 2022

バージョン名を含む関数がExEdit::Variablesにぶら下がっているのが気持ち悪いかもしれません。

サポート対象をマクロで記述させる案もあります(ヘッダライブラリがstatefulになるのは個人的にあまり好みではないのですが)

#define SUPPORT_EXEDIT092
#define SUPPORT_EXEDIT093rc1
#include <exedit.hpp>

BOOL func_init(AviUtl::FilterPlugin* fp) {
    // 非対応バージョンならば runtime_error
    ExEdit::Variables::init(fp);

    // ...
}

void foo() {
    // 解析情報が存在しなければコンパイルエラー
    const auto objs = *ExEdit::Variables::get<ExEdit::Variables::sortedObjectTable>();

    // 解析情報が存在しなければ nullptr を返す
    const auto n_ptr = ExEdit::Variables::get_nullable<ExEdit::Variables::sortedObjectTable::length>();

    // いずれも ExEdit::Variables::init() より前に呼び出したら runtime_error
    
    // ...
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants