2019年01月12日

元号チェック

今年05/02に?元号が変わるそうですね

phpでどうするのかなぁと検索したら、みな自前でやってるっぽいですね。。。

Windowsではシステム(WINAPI)から取得できます

今(2019/01/12)時点で 2019/05/02を表示するとどうなってるのか確認メモ

//---------------------------------------------------------------------------
//! 元号チェック
#include <vcl.h>
#pragma hdrstop
#include <tchar.h>

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

//---------------------------------------------------------------------------
//! 日時書式化
/*!
  @param[in] stime
  @param[in] date_fmt
  @param[in] time_fmt
  @return 書式化された日時文字列
*/
UnicodeString __fastcall GetDateTimeFormat( SYSTEMTIME *stime, const UnicodeString &date_fmt, const UnicodeString &time_fmt )
{
    TCHAR str[1024+1] = {0};
    UnicodeString date_time_str;
    DWORD date_flags = ( date_fmt.Pos0(_T("gg")) >= 0 ) ? DATE_USE_ALT_CALENDAR : 0;

    if( ::GetDateFormat( LOCALE_USER_DEFAULT, date_flags, stime, date_fmt.c_str(), str,  sizeof(str)/sizeof(str[0]) - 1 ) == 0 ) {
        RaiseLastOSError();
    }
    date_time_str = str;

    if( ::GetTimeFormat( LOCALE_USER_DEFAULT, 0, stime, time_fmt.c_str(), str,  sizeof(str)/sizeof(str[0]) - 1 ) == 0 ) {
        RaiseLastOSError();
    }
    date_time_str += str;

    return date_time_str;
}

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    Edit1->Text = _T("2019/05/02");
    Button1->Click();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    const UnicodeString date_fmt1 = _T("ggyyyy年MM月dd日 ddd曜日");
    const UnicodeString date_fmt2 = _T("yyyy年MM月dd日 ddd曜日");
    const UnicodeString time_fmt = _T("");

    SYSTEMTIME stime;
    ::ZeroMemory( &stime, sizeof(stime) );
    stime.wYear  = StrToInt(Edit1->Text.SubString0( 0, 4 ));
    stime.wMonth = StrToInt(Edit1->Text.SubString0( 5, 2 ));
    stime.wDay   = StrToInt(Edit1->Text.SubString0( 8, 2 ));
    //::GetLocalTime( &stime );

    Label1->Caption = ::GetDateTimeFormat( &stime, date_fmt1, time_fmt );
    Label2->Caption = ::GetDateTimeFormat( &stime, date_fmt2, time_fmt );
}
//---------------------------------------------------------------------------
実行してみると。。。
元号チェック.png
まだ「平成」ですね。。。

5/2時限式に自動で変るか、5/2にWindowsUpdateでもあるんでしょうかね???


ちなみに、1899年だとこんな感じ
元号チェック2.png


EXE置いておきます
test_gengo.7z

posted by sanahi at 14:39| 滋賀 ☔| Comment(0) | C++Builder | 更新情報をチェックする

2017年10月28日

SimpleReply.tsr Ver002

ずっと放置のAcknowrichですが、どうしても必要になったので、
SimpleReply.tsrプラグインを作成しました
http://sana.orz.ne.jp/software/ack/
http://sana.orz.ne.jp/software/ack/SimpleReply/

"設定した文字列+改行" を受信すると、
"設定した文字列+改行" を送信する
だけ
だけ、、、

posted by sanahi at 16:56| 滋賀 ☔| Comment(0) | Acknowrich | 更新情報をチェックする

2017年10月22日

Win10 Home Creators Update で RDPWrap を使う

Windows10 Home Edition Creators UpdateでRDPWrap(v1.6.1)を使うメモ

と、タイトル通りCreatersUpdate(Fallではない)でRDPWrapが機能しません
CreatersUpdate(Fallではない)のリリース後かなり経っているのですが、 最新のRDPWrap(v1.6.1)でもそのままでは動かない模様

システムファイルをいぢる(rfxvmt.dll)ので、セキュリティリスク等自己責任で。

  1. https://github.com/stascorp/rdpwrap/issues/194#issuecomment-325627235 よりrfxvmt.dllを取得して、system32にコピー
  2. uninstall.bat
  3. install.bat
  4. update.bat
  5. RDPConf.exeで「Listener state: Listening」になってればOK
    必要に応じてRDPCheck.exe
  6. WireWallを再確認(調整)

参考
Listener is not listening on Win 10 Home (build 14997+) #194
https://github.com/stascorp/rdpwrap/issues/194
-->https://github.com/stascorp/rdpwrap/issues/194#issuecomment-323564111

続きを読む
posted by sanahi at 20:04| 滋賀 ☔| Comment(0) | Software | 更新情報をチェックする

2017年05月13日

Chrome58対応オレオレ証明書

FreeBSD9.3 -> 11.0のUpgradeがようやく落ち着いた矢先に
SSLプライベート証明書がエラーになるようになりました
(missing_subjectAltNameとか)
Google Chrome 58からのセキュリティ対策らしいのですが
Androidにまで影響が出ているのでなんとかせねばなりません

いろいろ調べて結果以下の様な証明書で回避したのでメモ

前提として、 SSLプライベート証明書(オレオレ証明書)が server.csr,server.keyファイルと apacheで運用しているとします

  1. OpenSSLのコンフィグを修正
    /etc/ssl/openssl.cnf
    # 以下の行のコメントを外す
    ...
    [ CA default ]
    ...
    
    <# copy_extensions = copy
    > copy_extensions = copy
    
    ...
    
  2. v3.extファイルを作成
    v3.ext
    authorityKeyIdentifier=keyid,issuer
    basicConstraints=CA:TRUE
    keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
    subjectAltName = @alt_names
    
    [alt_names]
    DNS.1 = (domain name) <-- ここをドメインに
    
  3. csr, key ファイルを作成する
    # openssl req -new -sha256 -nodes -out server.csr -keyout server.key
    
  4. crt ファイルを作成する
    # openssl x509 -req -in server.csr -signkey server.key -out server.crt -days 365 -extfile v3.ext
    
  5. apache再起動
posted by sanahi at 02:50| 滋賀 ☔| Comment(0) | TrackBack(0) | FreeBSD | 更新情報をチェックする

2017年03月12日

wiro2 0.1.8.0.release

wiro2 0.1.8.0.release

http://sana.orz.ne.jp/wiro2/

64bit版を作成
従来の32bit版との調整

64bit版ですが、
アーカイバDLL等の64bit化が進んでいないため非推奨です
ただし、64bit版でしかディレクトリ一覧が参照できないパスがあるため悩ましい所です
FindFirst系の限界なんでしょうかね。。。

また、
GlassBoostモードというのがあるのですが、このモード時の使い勝手を少しよくしてみました

wiro2_sarani_glass_boost.jpg

そのたもろもろ。。。
posted by sanahi at 02:13| 滋賀 | Comment(0) | TrackBack(0) | wiro2 | 更新情報をチェックする

2016年11月26日

WIN64ビルドでcabinet sdkを使う

C++BuilderXE7で問題があったのでメモ
それ以降はもしかしたら直ってるかもしれない(直ってないかもしれない)

cabinet sdkをWIN64でビルドするとリンクエラーになる
[ilink64 エラー] Error: Unresolved external 'FDICreate' referenced from xxxx\WIN64\DEBUG\CABINET.O
[ilink64 エラー] Error: Unresolved external 'FDIDestroy' referenced from xxxx\WIN64\DEBUG\CABINET.O
[ilink64 エラー] Error: Unresolved external 'FDIIsCabinet' referenced from xxxx\WIN64\DEBUG\CABINET.O
[ilink64 エラー] Error: Unresolved external 'FDICopy' referenced from xxxx\WIN64\DEBUG\CABINET.O
libファイルのリンク方法は以下の通り
#if _WIN64
#pragma link "Cabinet.a" // リンクエラー
#else
#pragma link "Cabinet.lib" // OK
#endif
WIN32でビルドすると問題なく通る

幸いなことに最近の?RadStudioはPlatformSDKが入っているので、
FDI.HやCabinet.lib等のファイルを別途持ってくる必要なくビルドできる

で、問題はWIN64ですが、
clangに追従していないのか、付属のCabinet.aではダメっぽい
ちなみに、libファイルは以下の場所にある。
C:\Program Files (x86)\Embarcadero\Studio\15.0\lib\win32\release\psdk\Cabinet.lib
C:\Program Files (x86)\Embarcadero\Studio\15.0\lib\win64\release\psdk\Cabinet.a
以下のようにしてdllからCabinet.aファイルを作り直してそれを使えばいけた
mkexp Cabinet.a C:\Windows\System32\cabinet.dll
ただしこの方法は、なるべく古いOSのcabinet.dll(x64)で作成しないと、
古いOSで使えない場合がある
手元のcaibnet.dll(x64)は。。。
cabinet.dll 121.562KB 2016/07/16 20:42
Win10なのでとても新しい。。。。
XP(もしくはVista)の64bitあたりのcabinet.dllがほしいな。。。
posted by sanahi at 20:45| 滋賀 ☁| Comment(0) | TrackBack(0) | C++Builder | 更新情報をチェックする

2016年11月03日

WM_INPUTテスト

WM_INPUTを使うアレ
キーフックDLLを作らないで、グローバルフックみたいな どこでもキーを受けられるかテスト
XP以降
つかえるかなぁ~

Unit1.h

//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE で管理されるコンポーネント
private:	// ユーザー宣言
	void __fastcall OnWmInput(TMessage &msg);
	BEGIN_MESSAGE_MAP
		VCL_MESSAGE_HANDLER(WM_INPUT, TMessage, OnWmInput)
	END_MESSAGE_MAP(TForm)
public:		// ユーザー宣言
	__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

Unit1.cpp

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
	RAWINPUTDEVICE rid;
	::ZeroMemory( &rid, sizeof(rid) );
	rid.usUsagePage = 0x01; // <--このへんでキーボードかマウスか指定
	rid.usUsage = 0x06; // <--このへんでキーボードかマウスか指定
	//rid.dwFlags = RIDEV_NOLEGACY | RIDEV_EXINPUTSINK; // <-- RIDEV_NOLEGACYつけるかはお好みで
	rid.dwFlags = RIDEV_EXINPUTSINK;
	rid.hwndTarget = Handle;
	::RegisterRawInputDevices(&rid, 1, sizeof(rid));
}
//---------------------------------------------------------------------------
//! WM_INPUT イベントハンドラ
void __fastcall TForm1::OnWmInput(TMessage &msg)
{
	RAWINPUT raw;
	UINT sz = sizeof(raw);

	::GetRawInputData( (HRAWINPUT)msg.LParam, RID_INPUT, &raw, &sz, sizeof(raw.header) );
	// この辺の条件判定はお好みで...
	if( (raw.header.dwType == RIM_TYPEKEYBOARD) && (raw.data.keyboard.Flags & RI_KEY_BREAK) ) {
	  if( raw.data.keyboard.VKey == VK_SNAPSHOT ) { // PrintScreenキー
		::OutputDebugString(L"VK_SNAPSHOT\n");  // <-- ここ
	  }
	}
}
//---------------------------------------------------------------------------

posted by sanahi at 11:34| 滋賀 ☁| Comment(0) | TrackBack(0) | C++Builder | 更新情報をチェックする

2016年06月19日

IE11でWSHがエラー

IE11(Win8移行?)で
WScript.CreateObject("InternetExplorer.Application");を使うと、
一部のプロパティが使えなくなっていました
var ie = WScript.CreateObject("InternetExplorer.Application");
ie.Visible = false; // 機能しない
if( ie.Busy == true ) { // Object Error
}
if( ie.Document.readyState != "complete" ) { // Object Error
}
とりあえず保護モードをOFFにすると動くようになるらしい
ほごもーど.jpg
posted by sanahi at 16:03| 滋賀 ☔| Comment(0) | TrackBack(0) | JScript(WSH) | 更新情報をチェックする

2016年03月02日

プロパティ xFFF4F が存在しません

とても悩んでしまったのでメモ

XE7で TAlphaColorをプロパティにすると Win32はOKですが、
Androidで起動エラーになっています
機種はNexus4,KitKat4.4.4
$75744E6F で初回の例外が発生しました。
例外クラスは EReadError メッセージは 'プロパティ xFFF4F が存在しません'。 
プロセス Project1.apk (20370)
Error_xFFF4F.png
プロパティを使ったわけでもなく プロパティを含むソースをリンクしただけで
起動時にエラーとなって起動できません

新規プロジェクトを以下にするだけで起動できない
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <FMX.Controls.hpp>
#include <FMX.Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE で管理されるコンポーネント
private:	// ユーザー宣言
  TAlphaColor FTestColor;
  TAlphaColor __fastcall GetTestColor() {
    return FTestColor;
  }
  void __fastcall SetTestColor( TAlphaColor value ) {
    FTestColor = value;
  }
public:		// ユーザー宣言
  __fastcall TForm1(TComponent* Owner);
__published:
  __property TAlphaColor TestColor = { read=GetTestColor, write=SetTestColor }; // <-- この行があると起動不可
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

原因は調べてないのでとりあえずメモ

ラベル:XE7 android FMX
posted by sanahi at 01:33| 滋賀 ☔| Comment(0) | TrackBack(0) | C++Builder | 更新情報をチェックする

2016年02月18日

64bitOS上での32bit用Script実行

syntaxHilighter3テストがてら...

64bitOS上で32bitとしてJSを実行したい場合があります
理由は、COMコンポーネントが32bit用しかない場合です
というかBASP21使ってるから!

64bitOSではこんなバッチファイルで凌いでたのですが

test_wow64.bat
@echo off
%~d0
cd /d %~d0%~p0
start "" /min "%Systemroot%\SysWoW64\CScript.exe" "test.js" %*

いい加減面倒になってきたので、JS内で何とかしてみるテスト
test.js
Chg32bitScript();

var VBS_String = 'InputBox("てすと")';
var objSC = new ActiveXObject("ScriptControl");
objSC.Language = "VBScript";
WScript.Echo(objSC.Eval(VBS_String));

//-----------------------------------------------------------------
//! 32bitScript切替
/*! 64bitOS環境で実行時に32bitScriptとして再実行する
    @remarks 32bitOSや、32bitアプリからのScript実行時は何もしない
*/
function Chg32bitScript()
{
    var shell = WScript.CreateObject("WScript.Shell");
    if( (shell.ExpandEnvironmentStrings("%PROCESSOR_ARCHITECTURE%").indexOf("64") >= 0) && (WScript.FullName.toUpperCase().indexOf("SYSTEM32") >= 0) ) {
        // 64bit
        var fso = WScript.CreateObject("Scripting.FileSystemObject");
        var cscript_fname = fso.GetFileName( WScript.FullName );
        var cscript_fullname = fso.GetSpecialFolder(0).Path + "\\SysWOW64\\" + cscript_fname;
        if ( fso.FileExists(cscript_fullname) != true ) {
            // SysWOW64にcscript_fnameなし
            WScript.Quit(4001);
        }
        var args = "\"" + WScript.ScriptFullName + "\"";
        for( var i=0; i<WScript.Arguments.length; i++ ) {
            args += " \"" + WScript.Arguments(i) + "\"";
        }
        var ret = shell.Run( "\"" + cscript_fullname + "\" " + args, 10, true );
        WScript.Quit( ret );
    }
    else {
        // 32bit
    }
}

VBScript風InputBoxを表示しますが、このInputBoxは32bitでないと動きません
そのため64bitの場合は32bitで再実行してます
posted by sanahi at 20:39| 滋賀 ☀| Comment(0) | TrackBack(0) | JScript(WSH) | 更新情報をチェックする