知らなかった人も居るようなのでいちおー。
IShareMenuだけでは出来ないが,IShareCustomActionのShortCutプロパティを利用する事で可能。
設定する値についてはShortCut関数の説明を参照すること。
finalization,つまりDLL_DETATCHでEndThreadやってもスレッドは走行状態のままでWaitForSingleObject等の制御が戻らない。
故にTThread派生クラスは正常に破棄できないので適宜TerminateThread等を使う必要がある。
この問題はUninstallPluginで事前に終了処理が行えるようになって解決した。
大抵のプラグインはその機能を実装したクラスをInstallPluginでCreateする実装になっていると思う。
このクラスがInterfacedObjectであれば,UninstallPluginではPlugin.FreeではなくPlugin := nilとすべきである。
そうしないとAV出ることもあるよ。(某初心者向けTips)
値を取得する場合はPWideCharへのポインタで返ってくるが、セットする場合はインデックス指定する。
var DefaultID: PWideChar; begin Share_ConfigGet(ShareConfig_DefaultID, @DefaultID); //ワイド文字列として Share_ConfigSet(ShareConfig_DefaultID, 0); //0ではデフォルトID無し end
以下のコードで取得
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
「貼り付け」機能はハッシュの英文字が大文字だと反応しない予感。 TFileInfoからキー情報への変換の仕方はKeyCopyMenuのソースが参考になる。 (その場に適した表現を考えるべき)
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でないのがポイント。
ちょっと躓いたので書いておく。 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;
ちょっと自信ないのでお気を付け遊ばせ
COMとかそのあたりの問題かよくわかりませんが、
var IsPrimary: Boolean; begin Service.FolderManger.GetItem(0).GetValue(FolderValue_Primary, @IsPrimary); end;
だとAVが出ます。IsPrimaryをInt64にするとAV出ません。0だとFalse、それ以外だとTrueの予感。
私以外書かないし,ひょっとして要らないページ?
某初心者にとってはハマった部分でも、他の人には常識かもしれないので 書きにくい。(Delphiでは常識なのか、プラグイン独自の問題なのか判断が付かないときがある) PDKのヘッダファイルをコピペしてそこにコメント入れまくるって言うのも手かもしれない。
他人にとって常識かはあまり考えなくて良いと思うけどな。 同じところでハマる人を減らし,またちょっと込み入った部分を調べる手間を省くのが目的だし。 まーあまりにも初歩的なことだとアレだが……