2016年11月30日水曜日

C# ESENT 講座 Esent.Interop.dll 使用

インデックスを選択

Api.JetSetCurrentIndex(sesid, tableid, "indexName");

これでインデックス順にソートされます。Api.TryMoveFirst と Api.TryMoveNext で反復します。

インデックスで 1 レコードを検索

Api.JetSetCurrentIndex(ses.JetSesid, Streams.JetTableid, "Id");
Api.MakeKey(ses.JetSesid, Streams.JetTableid, Id, MakeKeyGrbit.NewKey);
Api.TrySeek(ses.JetSesid, Streams.JetTableid, SeekGrbit.SeekEQ)

これでいけるはずです。SeekGrbit.SeekGE などの場合は、値も比較すると良いかも。

UInt32 RealId = Api.RetrieveColumnAsUInt32(ses.JetSesid, Streams.JetTableid, C.Streams_Id) ?? 0U;
if (RealId == Id) { ... }

絶対レコード位置を取得

byte[] tmpMark = new byte[1024];
int cbMark = tmpMark.Length;
Api.JetGetBookmark(sesid, tableid, tmpMark, tmpMark.Length, out cbMark);

絶対レコード位置へ移動

Api.JetGotoBookmark(sesid, tableid, vr.mark, vr.mark.Length);

Note: EsentNoCurrentRecordException を食らう場合があります。

レコードを更新

Api.JetPrepareUpdate(ses.JetSesid, Folders.JetTableid, JET_prep.Replace);
Api.SetColumn(ses.JetSesid, Folders.JetTableid, C.FLDCOL_PARENT, FLDCOL_IDto);
Api.JetUpdate(ses.JetSesid, Folders.JetTableid);

2016年10月24日月曜日

CMD.exe バッチファイルの実行で「入力行が長すぎます。」

長すぎるとダメみたいです。

コマンド プロンプト (Cmd.exe) へ 8192 文字以上の引数を渡した場合に発生する現象
https://support.microsoft.com/ja-jp/kb/2823587

Windows 8.1 で、確認。

環境変数の展開を含めると、8192 文字。

環境変数の展開を含めなければ、32767 文字。

argv[0] も含めますので、その分は短くなります。

2016年9月29日木曜日

ディスク 1 (PDO 名: \Device\00000033) の論理ブロック アドレス 0x7d367d0 で IO 操作が再試行されました。

プチフリーズしてしまう…

イベントビューアを見ると、次のようなシステム イベントが残っています。

デバイス \Device\RaidPort0 にリセットが発行されました。

ディスク 1 (PDO 名: \Device\00000033) の論理ブロック アドレス 0x7d367d0 で IO 操作が再試行されました。

ーーー
結局私の場合、[電源オプション]、[PCI Express]→[リンク状態の電源管理]→[設定]=オフ にしたら、でなくなりました。


参考:
Freezes with storahci error 129 in Event Protocol
http://www.tomshardware.com/answers/id-2318245/freezes-storahci-error-129-event-protocol.html

ーーー
あと、AHCI Link Power Management - HIPM/DIPM を HIPM→Active に変更しました。


この設定を表示する方法は、こちら:

Storahci, ID 129, Reset to device, \Device\RaidPort0, was issued - fix for Windows 10 Technical Preview
http://www.nxhut.com/2015/01/storahci-id-129-reset-to-device.html#!/2015/01/storahci-id-129-reset-to-device.html

ーーー
あと、こちらも試しました。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\storahci\Parameters\Deviceにあるサブキー「NoLPM」の値を確認
デバイスマネージャーを確認してSSDの名前を値に追加し、その後に*をつける


storahciの件、直りました
http://mru.txt-nifty.com/blog/2016/08/storahci-26f3.html

ーーー
まとめますと… Windows か TS256GSSD370S か M/B か、どの部分かわかりませんが、
「送った DiskRead 要求が(恐らく省電力関係の)不具合により、ときどき忘れられてしまい、30 秒間応答が帰ってこないのでエラーと判断、再試行した。」

そんな感じがしました。これ、書き込み操作でこんなことが起こると大惨事ですよね。しっかりしてほしいものです。

ーーー
ためしたが、今回あてはまなかったこと…

Crystal Disk Info で、SMART 情報をチェック:正常でした。


Transcend SSD Scope でチェック:正常のようです


Intel(R) 7 Series/C216 Chipset Family SATA AHCI Controller - 1E02」から「標準 SATA AHCI コントローラー」に変更:効果なし


HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\storahci\StartOverride を 3 から 0 に変更する
→ StartOverride が見つからなかったので、試していません。

Windows 8/8.1で時々躓くような、カクカクとした重い操作が気になるようになったら確認してみること
http://dorodorodoroid.hatenablog.com/entry/2015/01/29/000622

ーーー

2016年9月12日月曜日

IShellExtInit::Initialize の IDataObject につきまして

IShellExtInit::Initialize の IDataObject で、EnumFormatEtc したら?

ショートカット 2 個を右クリック

-16155 Shell IDList Array   DVASPECT_CONTENT -1 TYMED_HGLOBAL
    15 CF_HDROP             DVASPECT_CONTENT -1 TYMED_HGLOBAL
-16378 FileName             DVASPECT_CONTENT -1 TYMED_HGLOBAL
-16152 FileContents         DVASPECT_CONTENT -1 TYMED_ISTREAM
-16377 FileNameW            DVASPECT_CONTENT -1 TYMED_HGLOBAL
-16150 FileGroupDescriptorW DVASPECT_CONTENT -1 TYMED_HGLOBAL

PDF ファイル 1 個を右クリック

-16155 Shell IDList Array                     DVASPECT_CONTENT -1 TYMED_HGLOBAL
-15488 DataObjectAttributes                   DVASPECT_CONTENT -1 TYMED_HGLOBAL
-15490 DataObjectAttributesRequiringElevation DVASPECT_CONTENT -1 TYMED_HGLOBAL
    15 CF_HDROP                               DVASPECT_CONTENT -1 TYMED_HGLOBAL
-16378 FileName                               DVASPECT_CONTENT -1 TYMED_HGLOBAL
-16152 FileContents                           DVASPECT_CONTENT -1 TYMED_ISTREAM
-16377 FileNameW                              DVASPECT_CONTENT -1 TYMED_HGLOBAL
-16150 FileGroupDescriptorW                   DVASPECT_CONTENT -1 TYMED_HGLOBAL


フォルダ 1 個を右クリック

-16155 Shell IDList Array                     DVASPECT_CONTENT -1 TYMED_HGLOBAL
-15488 DataObjectAttributes                   DVASPECT_CONTENT -1 TYMED_HGLOBAL
-15490 DataObjectAttributesRequiringElevation DVASPECT_CONTENT -1 TYMED_HGLOBAL
    15 CF_HDROP                               DVASPECT_CONTENT -1 TYMED_HGLOBAL
-16378 FileName                               DVASPECT_CONTENT -1 TYMED_HGLOBAL
-16377 FileNameW                              DVASPECT_CONTENT -1 TYMED_HGLOBAL






2016年8月12日金曜日

JavaScript for Acrobat で、Adobe Acrobat Reader DC を拡張

そういうことができるらしいです。

このような JavaScript を %AppData%\Adobe\Acrobat\Privileged\DC\JavaScripts\Hello.js とかに保存して、Adobe Acrobat Reader DC を起動し、PDF を開くと…

function helloWorld()
{ 
     //Say Hello World
     app.alert("Hello World with this " + this);
}

app.addToolButton({
       cName: "helloWorldBtn", // A name for your button
       cExec: "helloWorld()", //Function to Call
       cLabel: "Hello World", //The Text on the Button
       cTooltext: "Say Hello World" //The Help Text
}); 


何やら右下にアドオンツールというものが追加されます。

試しにクリックすると、あら素敵! アドオンツールに、Hello World が!

クリックすると、

メッセージが表示されます。

これでもう簡単なプラグインは JavaScript でも書くことができるし、Reader でも使えるし、いいことずくめですか?

2016年7月16日土曜日

OneNote one ファイル形式

ファイル形式の仕様書:

[MS-ONE]: OneNote File Format
https://msdn.microsoft.com/en-us/library/dd924743(v=office.12).aspx

[MS-ONESTORE]: OneNote Revision Store File Format
https://msdn.microsoft.com/en-us/library/dd951288(v=office.12).aspx

ファイル形式について:
  • 完全にバイナリ。容易に可読できる形式には直りません。
  • 概念が複雑。階層が深いし、内部参照も多い。


XML に変換すると、多少分かり易くなるかもしれません。サンプル

仕様書と、サンプルの one ファイルと、解析結果の XML ファイルを見れば、解析作業を助けると思います。

読み込むだけであれば、まだ楽です。

よく現れる構造体 ExtendedGUID につきまして。
ExtendedGUID = GUID + int32 です。
例: Root Extended GUID: MUST be "{{ 4A3717F8- 1C14-49E7-9526-81D942DE1741 },  1}".
GUID はそのままですが、int32 の意味は利用場所によって異なります。要は ID なので、(名前空間 + 整理番号) のような使われ方が基本です。もっと砕けば(一意なフォルダ番号 + ファイル番号) のような感じです
  • CompactID。出来上がりは ExtendedGUID ですが、中身は int8 + int24 です。
    • 2 つ目の int24 で、GlobalIdTable 中の GUID を 1 つ指定、
    • 1 つ目の int8 で、ExtendedGUID の int32 を埋めます。
  • ObjectID。CompactID の配列。他の FileNode を参照。FileNode の oid と一致する物を参照します。FileNode は兄弟とは限りません。後記するリビジョン管理の為、親戚(親の子)の場合も有ります。
  • ContextID。CompactID の配列
  • ObjectSpaceID。CompactID の配列

one ファイルは、多数のチャンク(オフセット+バイト数)が散りばめられた、
ファイルシステムのような構造を呈しております。

ファイルやフォルダーのような階層構造の概念があり、FileNode を使って表します。
FileNode の形式には 3 種類有り、
  • None。可変データ fnd が有ります。
  • Node。子 FileNode を持っています。可変データ fnd も有ります。
  • Data。ファイル中のチャンクへの参照(ObjectSpaceObjectPropSet 等)が有ります。可変データ fnd も有ります。
FileNodeID を見て、FileNode の構造(fnd の中身、チャンクの中身)を指定します。
FileDataStoreObjectReferenceFND であれば、チャンクの中身は、添付ファイル+αの情報です。


ObjectDeclaration2RefCountFND 等には、oid と jcid が有ります。oid と jcid が付いている FileNode は、有用なデータを含みます。oid は、CompactID。ObjectID 中の CompactID として、他の FileNode から参照されます。
jcid は、FileNode の抽象的な意味です。jcidRichTextOENode とか、jcidOutlineElementNode とか、jcidOutlineNode とか、jcidPageNode とか。

リビジョン管理が有ります。
「ページのバージョンを表示」で、古いバージョンを参照できたりします。
新しいリビジョンは、前のリビジョンにちょっと変更を加えた程度のものと考えてください。古い FileNode を置き換える為に、同じ oid を指定します。
RevisionManifestStart6FND または RevisionManifestStart7FND で始まります。
rid と ridDependent を持っていて、親子関係を形成します。ridDependent が無くなるか、ridDependent が空になるまで遡ります。
Start と End の間に ObjectGroupListReferenceFND が有り、この FileNode の中に、起点となる jcidPageManifestNode (ObjectDeclaration2RefCountFND) が出て参ります。最初のリビジョンにだけ出現し、後の方のリビジョンには通常出て来ません。


jcidPageSeriesNode を収めています RevisionManifestListReferenceFND の中も ObjectGroupListReferenceFND が使われていますので、リビジョン管理の必要が有ります。

2016年7月7日木曜日