プラグイン作成メモ


全般

メニューのアクセラレータ

知らなかった人も居るようなのでいちおー。
IShareMenuだけでは出来ないが,IShareCustomActionのShortCutプロパティを利用する事で可能。
設定する値についてはShortCut関数の説明を参照すること。

終了処理

finalization,つまりDLL_DETATCHでEndThreadやってもスレッドは走行状態のままでWaitForSingleObject等の制御が戻らない。
故にTThread派生クラスは正常に破棄できないので適宜TerminateThread等を使う必要がある。
この問題はUninstallPluginで事前に終了処理が行えるようになって解決した。

オブジェクトの破棄

大抵のプラグインはその機能を実装したクラスをInstallPluginでCreateする実装になっていると思う。
このクラスがInterfacedObjectであれば,UninstallPluginではPlugin.FreeではなくPlugin := nilとすべきである。 そうしないとAV出ることもあるよ。(某初心者向けTips)

ShareConfig_DefaultID

値を取得する場合はPWideCharへのポインタで返ってくるが、セットする場合はインデックス指定する。

var
 DefaultID: PWideChar;
begin
 Share_ConfigGet(ShareConfig_DefaultID, @DefaultID); //ワイド文字列として
 Share_ConfigSet(ShareConfig_DefaultID, 0); //0ではデフォルトID無し
end

ActionManager

組み込みアクション名一覧

以下のコードで取得

 for i := 0 to Service.ActionManager.GetCount - 1 do
 begin
   Share_Logadd(Service.ActionManager.GetItem(i).Name);
 end;
ConfigGeneral
ConfigCluster
HelpAbout
HelpConHelp
HelpConHelp2
QueryAddDownload
QueryDeleteDownload
QueryDeleteCache
NodeAdd
NodeEncrypt
NodeClear
NodeDisconnectAll
NodeDisconnectSearch
NodeToggleConnect
FolderAdd
FolderDelete
FolderCheck
FolderQuickCheck
FolderSetPrimary
QueryAddTrigger
QueryAddFilter
QueryConvert
QueryDeleteDB
QueryDamageCheck
QueryAddUpload
QueryDeleteUpload
QueryCopyFileName
QueryCopyID
QueryCopyHash
QueryCopyInfo
QueryAddDB
QueryProperty
FilterBtnDB
FilterBtnRemote
FilterBtnLocal
FilterBtnComplete
FilterBtnLink
QueryEditQuery
FilterBtnSynonym
FilterBtnFilter
QryTabDelete
QryTabDeleteRight
QryTabDeleteLeft
QryTabDeleteAll
TriggerAdd
TriggerDelete
TriggerEdit
TriggerPaste
TaskCancel
TaskClearList
QueryEditQryErase
QueryEditQryEdit
QueryEditQryReload
QueryEditQrySort
QueryEditIDErase
QueryEditIDEdit
QueryEditIDReload
QueryEditIDSort
LogCopy
DownShowCache
CmdSelectAll
LogErase
TaskTrayExit
TaskTrayRestore
TaskTrayMinimize
FilterAdd
FilterDelete
FilterEdit
UploadDelete
DownPriorityUp
DownPriorityDown
TriggerSort
TriggerUp
TriggerDown
FilterSort
FilterUp
FilterDown
DownCreateCache
TriggerReSearch
DownConvert
FolderEdit
DownPriorityReset
ConfigAutoHide
QueryRename
ConfigGUI
UploadTurbo
ConfigPlugin
ConfigFilter
FolderEraseUnusedCache
QryTabSort
SelAlignTop
SelAlignLeft
SelAlignRight
SelAlignBottom
SelToggleAutoSize
DownDelete
DownSort
DownUp
DownDown
DownEnableAll
DownDisableAll
TriggerEnableAll
TriggerDisableAll
DownAdd
NodeShowSleep
DbgDamage0
DbgDamage1
DbgDamage2
DbgEraseBlock
DbgDeleteCache
DbgShowCacheHost
DbgResetBCast
DbgAddStealth
DbgRemoveStealth
DbgRemoveStealthFlag
DbgResetPacket
DbgCountHost
DbgResetHostCnt

TriggerManager

キー情報について

「貼り付け」機能はハッシュの英文字が大文字だと反応しない予感。 TFileInfoからキー情報への変換の仕方はKeyCopyMenuのソースが参考になる。 (その場に適した表現を考えるべき)

DownloadManager


優先度の設定

DownloadValue_Priorityは読み込み専用っぽい。

var
  item: IShareItem;
  index: Integer;
  priority: Integer;
begin
  index := 0;
  Service.DownloadManager.GetItem(index);
  priority := 0;
  item.Execute(DownloadCmd_SetPriority, Pointer(priority));
end;

とかやればOK。
Executeの第二引数は@priorityでないのがポイント。

DBManager

DBから検索したいとき

ちょっと躓いたので書いておく。 PDKのdemo3とかも参考になるので見るよろし

procedure SearchDB;
const
 SearchDBWord: PWChar = 'Share Plugin';
var
 Searcher: IShareSearcher;
 DBQuery: IShareDBQuery;
 QID: TIDStr;
 Hash: TSHA1Hash;
 IncHash: Bool;
begin
 Searcher := Service.CreateSearcher(SearchDBWord, Hash, IncHash);
 //HashとかIncHashはよく分からんが他で使うのか?
 QID.IDType := 0;//IDは使わない場合
 DBQuery := Service.DBManager.Query(Searcher, QID, nil);
 //Hash を nilにしておくとクエリワードのみでの検索
 //ハッシュが分かっているのだったらIShareDBManager.QueryInfoとか
 DBQuery.Enum(EnumProc);
 //ヒットしたものに対する処理
end;

function EnumProc(const DBItem: IShareDBItem; IsLast: BOOL): BOOL;
begin
 Share_LogAdd(PWChar(FileNameToString(DBItem.FileInfo^)));
 Result := True; 
 //Result := False とするとクエリにヒットした残りのアイテムに対してEnumProcを実行するのをやめるらしい
end;

ちょっと自信ないのでお気を付け遊ばせ

FolderManager

FolderValue_Primaryについて

COMとかそのあたりの問題かよくわかりませんが、

var
 IsPrimary: Boolean;
begin
 Service.FolderManger.GetItem(0).GetValue(FolderValue_Primary, @IsPrimary);
end;

だとAVが出ます。IsPrimaryをInt64にするとAV出ません。0だとFalse、それ以外だとTrueの予感。


私以外書かないし,ひょっとして要らないページ?

某初心者にとってはハマった部分でも、他の人には常識かもしれないので 書きにくい。(Delphiでは常識なのか、プラグイン独自の問題なのか判断が付かないときがある) PDKのヘッダファイルをコピペしてそこにコメント入れまくるって言うのも手かもしれない。

他人にとって常識かはあまり考えなくて良いと思うけどな。 同じところでハマる人を減らし,またちょっと込み入った部分を調べる手間を省くのが目的だし。 まーあまりにも初歩的なことだとアレだが……