コンピュータや音楽の事書いてます

Outlook 次の未読メールへ移動して既読にする

適当なフォームにボタンとテキストボックスを作って下記コードをボタンに割り当てる。
スレッドビューの場合にはメールの選択が出来ないみたい。謎仕様。。。。。
しかたないのでDisplayメソッドでポップアップさせてしまうか、テキストボックスへの表示にするか。

Private Sub buttonKidokuNext_Click()
    Dim m As MailItem, e As Explorer, fo As Folder, ms As Items
    Set e = Application.ActiveExplorer
    Set fo = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox)
    Set ms = fo.Items.Restrict("[UnRead] = True")
    If ms.Count = 0 Then Exit Sub
    ms.Sort "[ReceivedTime]"
    Set m = ms(1)
    If fo.Store.IsConversationEnabled Then
        'スレッドビューの場合
        m.Display False
        TextBox1.Text = Join(Array(m.ReceivedTime, m.SenderName, m.Subject, m.Body), vbCrLf)
    Else
        'スレッドビューじゃない場合(こっちが理想)
        e.ClearSelection
        e.AddToSelection m
    End If
    m.UnRead = False
End Sub

New-Object -ComObject excel.application のお行儀の悪い楽なお片付け

プログラムなどでExcel操作をすると、プロセスが残ってしまう問題。
残らないようにするには、
Workbook
Worksheet
Range
その他色々・・・・・・・使ったあとに全てのオブジェクトに対して、いちいち

をしなければならない。そして頑張って片付けたつもりなのに何か開放忘れがあり、結局プロセスが残ってしまうことが良くある。。。。めんどくせえ

お行儀がなんぼのもんじゃいw

スクリプトなどで立ち上げたExcelのプロセスをタスクマネージャで確認してcommandline列を追加すると、"automation -Embedding"という謎のパラメータが入っている。これを手がかりにKillしてやれば良いのでは?

  • 推測
    • killしたあとのExcelはOSさんが勝手に片付けてくれる
    • 実行時間がそれほど長くないプログラムならばリークしたメモリが何日も残ることはない
      • ならば、 kill=片付け で問題ないのでは?
#automationのExcelをkillする
$pstokill = Get-WmiObject win32_process | where commandline -match "EXCEL.*automation -Embedding" | select ProcessId, name, commandline
(Get-Process | where Id -eq $pstokill.ProcessId).kill()

C++Builder用ソースをVisual Studio Codeで閲覧するとき インテリセンスのハイライトがうまく効かない

C++Builder10.2 Tokyoで行った。VCLプロジェクトのソースでだいたい良い感じになった。
それ以外のバージョンやプロジェクトタイプについては分からない。
FastReport対応。
definesはインテリセンスが吐くエラー内容を見て、それらしいものを埋めていった。
compilerArgsにはビルド時に指定されていたオプションを全部つっこんでみた。
.vscode\c_cpp_properties.json を下記の様に作成。

{
    "configurations": [
        {
            "name": "Win32",
            "compilerPath": "C:\\Program Files (x86)\\Embarcadero\\Studio\\19.0\\bin\\bcc32c.exe",
            "includePath": [
                "${workspaceFolder}/**",
                "C:\\Program Files (x86)\\Embarcadero\\Studio\\19.0\\include\\dinkumware64",
                "C:\\Program Files (x86)\\Embarcadero\\Studio\\19.0\\include\\windows",
                "C:\\Program Files (x86)\\Embarcadero\\Studio\\19.0\\include\\windows\\crtl",
                "C:\\Program Files (x86)\\Embarcadero\\Studio\\19.0\\include\\windows\\fmx",
                "C:\\Program Files (x86)\\Embarcadero\\Studio\\19.0\\include\\windows\\rtl",
                "C:\\Program Files (x86)\\Embarcadero\\Studio\\19.0\\include\\windows\\sdk",
                "C:\\Program Files (x86)\\Embarcadero\\Studio\\19.0\\include\\windows\\vcl",
                "C:\\Program Files (x86)\\FastReport VCL Enterprise\\LibD25",
                "c:\\program files (x86)\\embarcadero\\studio\\19.0\\source\\ComServers\\OfficeXP",
                "c:\\program files (x86)\\embarcadero\\studio\\19.0\\source\\cpprtl\\Source\\except",
                "c:\\program files (x86)\\embarcadero\\studio\\19.0\\include\\windows\\crtl\\JA",
                "c:\\program files (x86)\\embarcadero\\studio\\19.0\\include\\windows\\rtl\\JA",
                "C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\19.0\\hpp\\Win32",
            ],
            "intelliSenseMode": "clang-x64",
            "cStandard": "c11",
            "cppStandard": "c++11",
            "defines": [
                "VCL_FULL",
                "_C_AS_CPP", 
                "__BORLANDC__",
                "UNICODE", 
                "_UNICODE", 
                "_DEBUG", 
                "__clang__", 
                "__declspec(x)=", 
                "__attribute__(x)=", 
                "__builtin_va_list=char*",
                "__builtin_va_start(v,l)=(v=(va_list)(&l+1))",
                "__builtin_va_end(v,l)=",
                "__published=public",
                "__fastcall=",
                "__property=",
                "__classmethod="
            ],
            "compilerArgs": [
                "-fdeclspec", 
                "-fms-extensions", 
                "-fno-limit-debug-info", 
                "-fborland-extensions", 
                "-fdiagnostics-format", 
                "borland", 
                "-nobuiltininc", 
                "-nostdsysteminc", 
                "-triple", 
                "i686-pc-win32-omf", 
                "-emit-obj", 
                "-cxx-abi", 
                "borland", 
                "-masm-verbose", 
                "-ffunction-sections", 
                "-fexceptions", 
                "-fcxx-exceptions", 
                "-fseh", 
                "-mdisable-fp-elim", 
                "-fno-spell-checking", 
                "-fno-use-cxa-atexit", 
                "-fno-threadsafe-statics", 
                "-main-file-name"
            ]
        }
    ],
    "version": 4
}

C++ 戻り値のオーバーロード

戻り値だけが異なる同じ名前の関数をオーバーロード定義は出来ない。

クラスにして型変換オペレータを定義すればほぼ近いことが出来る。

#include <iostream>
#include <string>
using namespace std;

class C {
    int v;
public: 
    C(int _v){ v = _v; }
    operator int(){
        return v * 2;
    }
    operator string(){
        return to_string(v * 2);
    }
};

int main(){
    int r1 = C(3);
    string r2 = C(4);
    cout << r1 << endl;
    cout << r2 << endl;
}

Excelの表からSQLのINSERT文のVALUE行作成時、数値以外にシングルクォーテーション

数値以外に対してシングルクォーテーションで囲みたい
Excelでは日付も数値とみなされるので、isNumber関数とかValue関数では判定出来ないが、CELL("format",A1)を使えば、セル書式に基づいて判断できる
セル書式の1文字目は

  • 数値 : "F"
  • 日付 : "D"

なので"F"以外をシングルクォーテーションで囲めば良い。TEXTJOINとMAPとLAMBDAを組み合わせる。
セル範囲[$A2:$D2]から一発でvalues行を作成

=CONCAT("(",TEXTJOIN(",",FALSE,MAP($A2:$D2,
  LAMBDA(v,
    LET(
      t,"'"&v&"'",
      d,"'"&TEXT(v,"yyyy/mm/dd hh:mm:ss")&"'",
      f,LEFT(CELL("format",v),1),
      IF(f="F",v,
        IF(f="D",d,
          t
        )
      )
    )
  )
)),"),")

一般ユーザにレジストリ変更を一部だけ許可する

通常、一般ユーザはHKEY_CURRENT_USERしか変更出来ないが、HKEY_LOCAL_MACHINEなどの一部だけを許可したいとき。
$regkeyのところは、設定したいレジストリキー。
Users に対して許可する。
ContainerInheritとObjectInheritを指定するので、配下も許可することになる。

$regkey="HKLM:SOFTWARE\WOW6432Node\ImageMagick"
$acl=Get-Acl $regkey
$idRef = [System.Security.Principal.NTAccount]("Users")
$regRights = [System.Security.AccessControl.RegistryRights]::FullControl
$inhFlags = [System.Security.AccessControl.InheritanceFlags]::ContainerInherit
$inhFlags+= [System.Security.AccessControl.InheritanceFlags]::ObjectInherit
$prFlags = [System.Security.AccessControl.PropagationFlags]::None
$acType = [System.Security.AccessControl.AccessControlType]::Allow
$rule = New-Object System.Security.AccessControl.RegistryAccessRule ($idRef, $regRights, $inhFlags, $prFlags, $acType)
$acl.AddAccessRule($rule)
$acl | Set-Acl -Path $regkey

確認

$acl=Get-Acl $regkey
$acl.Access

固定長テキストファイルから桁指定でcsvファイルへ抜き出し

subAddQuoteは$strの$s文字目から$n文字を抜き出し(ゼロ始まり)
セル内は="xxxx"の形にするので、Excelで開いたときに指数形式に勝手に変換されたり、頭の0を取り除かれたりしない。
col1~3はCSVの列名になる。

function subAddQuote([string]$str, [int]$s, [int]$n){
	return "=""" + $str.substring($s,$n) + """"
}
cat "in.txt" | foreach {
	[PSCustomObject]@{
		col1 = subAddQuote $_ 163 4
		col2 = subAddQuote $_ 267 12
		col3 = subAddQuote $_ 568 8
	}
} | export-Csv out.csv