SQLの窓

2009年12月07日


コマンドプロンプト : 入力したキーストロークを表示しない readkey.exe

ブラウザでダウンロード
標準入力でデータを入力できるアプリケーションに対して、
パスワード等の入力時に表示させたくない処理を想定して作成しました。

php による FTP ダウンロードのサンプルを付加しています

Framework では、日本語入力がうまくいかなかったので、VC8 でビルド
した readkey_vc.exe ( 含ソースコード ) も添付しています
Imports System.Text
Imports System.Threading

Module MyModule

' ********************************************************
' * エコー無しのキー入力
' * Backspace キーでバッファクリア
' * Enter で入力内容を標準出力
' ********************************************************
Sub Main()

	Dim cki As ConsoleKeyInfo = New ConsoleKeyInfo()
	Dim ret As String = ""

	Do
		' 押されたキーが入力ストリームに入るるまで待つ
		Do While Console.KeyAvailable = False
			Thread.Sleep(250)
		Loop

		' キーを取得( エコーしない )
		cki = Console.ReadKey(True)
		if cki.Key = ConsoleKey.Enter
			Exit Do
		end if
		if cki.Key = ConsoleKey.Backspace
			ret = ""
		else
			ret = ret & Char.ToString(cki.KeyChar)
		end if
	Loop

	Console.WriteLine( ret )

End Sub

End Module

#include <stdio.h>
#include <tchar.h>
#include <conio.h>
#include <ctype.h>

int _tmain(int argc, _TCHAR* argv[])
{
	int ch;

	char buff[1024];
	int p;

	buff[0] = 0x00;
	p = 0;
	while(1) {
		ch = _getch();
		if ( char(ch) == 0x0d ) {
			break;
		}
		if ( char(ch) == 0x08 ) {
			buff[0] = 0x00;
			p = 0;
			continue;;
		}
		buff[p] = ch;
		p++;
		buff[p] = 0x00;
	}

	printf("%s\n", buff);

	return 0;
}

@echo off
echo 以下にパスワードを入力して下さい & readkey | php.exe ftp_download.php

************************************************************
* エコー無し入力
* 入力した結果は表示されず、Enter キーを入力すると
* 標準出力へ出力します
* Back Space で入力内容をリセットできます
************************************************************

【VB.net : 日本語入力不可】
readkey.exe 

【VC8 : 日本語入力可】
readkey_vc.exe 

************************************************************
* 利用方法
************************************************************
入力時に表示したくないパスワード入力に使用します。
結果をリダイレクトする事によって次のアプリケーション
にパスワードを引き渡します

************************************************************
* 自分でビルドしたい場合( readkey.vb )
************************************************************
Framework3.5 でビルドする場合は、build_35.bat を実行します。
以下のファイルがあれば動作するばずです

C:\WINDOWS\Microsoft.NET\Framework\v3.5\vbc.exe

Framework2.0 でビルドする場合は、build_2.bat を実行します。
以下のファイルがあれば動作するばずです

■ 同梱している httpdownload.exe は、2.0 でビルドしています

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\vbc.exe


************************************************************
* ソースコード
************************************************************
■ readkey.vb

■ readkey_vc.cpp


************************************************************
* PHP を使ったサンプル
************************************************************
■ ftp_download.php

■ run.bat


************************************************************
* その他
************************************************************
■ 著作権その他

このプログラムはフリーです。どうぞ自由に御使用ください。
著作権は作者である私(lightbox)が保有しています。
また、本ソフトを運用した結果については、作者は一切責任を
負えせんのでご了承ください。


VB.net 関連の記事


posted by lightbox at 2009-12-07 17:18 | VB.NET : ベーシック | このブログの読者になる | 更新情報をチェックする

2009年12月05日


VB.net : ( vbc.exeで )自分でも簡単にビルドできる HTTP プロトコルを用いたダウンローダ



たぶん、普通にWindows アップデートとかされておれば、Framework 3.5 用の VB をビルドするコンパイラである vbc.exe が使えるとおもうのですが、そのvbc.exe を使った簡単なビルドセットです。


@echo off setlocal set PATH=%windir%\Microsoft.NET\Framework\v3.5;%PATH% vbc httpdownload.vb
バッチファイルを使って現在の環境に影響しないように一時的に環境変数をセットしてビルドします。Framework2.0 用も用意しており、おまけとしてC# 用のコードも付加しています。 プログラムが解らない人は、httpdownload.exe をそのままお使いいただけます。 httpdownload.exe URL "ローカルパス" [s] ※ s を指定しないと、ダウンロードしたディレクトリをエクスプローラで開きます
Imports System.IO	' Path
Imports System.Diagnostics	' Process
Imports System.Runtime.InteropServices	' DllImport

Module MyModule

<DllImport("urlmon.dll", CharSet:=CharSet.Unicode)> _
Private Function URLDownloadToFile( _
  ByVal pCaller As Integer, _
  ByVal szURL As String, _
  ByVal szFileName As String, _
  ByVal dwReserved As Integer, _
  ByVal lpfnCB As Integer _
) As Integer
End Function

' **********************************
' * Win32 API でHTTPダウンロード
' **********************************
Sub Main()

	Dim argv As String()
	argv = System.Environment.GetCommandLineArgs()

	Dim ret As Integer
	Dim str As String

	If argv.Length >= 3 Then
		ret = URLDownloadToFile( 0, argv(1), argv(2), 0, 0 )
		if ret = 0 then
			str = Path.GetFullPath( argv(2) )
			str = Path.GetDirectoryName( str )
			if argv.Length = 4 then
				if  argv(3) = "s" then
				else
					' 第3引数に s を指定しない場合は
					'  エクスプローラを開く
					Process.Start("explorer.exe","/e,"+str)
				end if
			else
				' 第3引数に s を指定しない場合は]
				' エクスプローラを開く
				Process.Start("explorer.exe","/e,"+str)
			end if
		end if
	end if

End Sub

End Module

' 古い vb の定義
' Private Declare Function URLDownloadToFile Lib "urlmon" Alias _
' "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal _
' szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long
' ▼
' http://support.microsoft.com/kb/244757/ja

VB の中は、Framework では無く Win32API を使っています。URLDownloadToFile という単純な API があるので、簡単ですが、VC でビルドするには環境設定がたいへんですが、VB.net だととても簡単なので。
************************************************************
* httpdownload.exe
* ( http ダウンローダ )
************************************************************

************************************************************
* 実行方法
************************************************************
そのまま使う場合は、以下のように指定します

httpdownload.exe ダウンロードURL "ダウンロードパス" [s]

ダウンロードパスは、a.lzh のようにカレントでもかまいません s を指定しないと、ダウンロード後にエクスプローラが起動してダウンロードしたディレクトリを開きます


************************************************************
* 自分でビルドしたい場合
************************************************************
Framework3.5 でビルドする場合は、build_35.bat を実行します。以下のファイルがあれば動作するばずです

C:\WINDOWS\Microsoft.NET\Framework\v3.5\vbc.exe

■ 同梱している httpdownload.exe は、3.5 でビルドしています

Framework2.0 でビルドする場合は、build_2.bat を実行します。以下のファイルがあれば動作するばずです

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\vbc.exe


************************************************************
* ソースコード
************************************************************
■ httpdownload.vb

■ httpdownload2.cs
   C# 用です。build_35.bat が動く場合、vbbuild_35_cs.bat でビルドできるはずです

************************************************************
* その他
************************************************************
■ 著作権その他

このプログラムはフリーです。どうぞ自由に御使用ください。
著作権は作者である私(lightbox)が保有しています。
また、本ソフトを運用した結果については、作者は一切責任を
負えせんのでご了承ください。
以下は C# のコードですが、VB.NET -> C# 変換 で変換してビルドすると少しだけエラーが出るので修正してあります
using System.IO; 
using System.Diagnostics; 
using System.Runtime.InteropServices; 

static class MyModule 
{ 
    
    [DllImport("urlmon.dll", CharSet = CharSet.Unicode)] 
    private static extern int URLDownloadToFile(int pCaller, string szURL, string szFileName, int dwReserved, int lpfnCB);
    
    // **********************************
    // * Win32 API でHTTPダウンロード 
    // **********************************
    public static void Main() 
    { 
        
        string[] argv = null; 
        argv = System.Environment.GetCommandLineArgs(); 
        
        int ret = 0; 
        string str = null; 
        
        if (argv.Length >= 3) { 
            ret = URLDownloadToFile(0, argv[1], argv[2], 0, 0); 
            if (ret == 0) { 
                str = Path.GetFullPath(argv[2]); 
                str = Path.GetDirectoryName(str); 
                if (argv.Length == 4) { 
                    if (argv[3] == "s") { 
                    } 
                    else { 
                        // 第3引数に s を指定しない場合は 
                        // エクスプローラを開く 
                        Process.Start("explorer.exe", "/e," + str); 
                    } 
                } 
                else { 
                    // 第3引数に s を指定しない場合は] 
                    // エクスプローラを開く 
                    Process.Start("explorer.exe", "/e," + str); 
                } 
            } 
            
        } 
    } 
    
} 

// 古い vb の定義 
// Private Declare Function URLDownloadToFile Lib "urlmon" Alias _ 
// "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal _ 
// szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long 
// ▼ 
// http://support.microsoft.com/kb/244757/ja 






タグ:VB.NET HTTP
posted by lightbox at 2009-12-05 06:09 | フリーソフト | このブログの読者になる | 更新情報をチェックする

2009年12月03日


VB.net/C# : 連続する文字の作成と良く使う文字列フォーマット

文字列へ変換するフォーマット文字列は、数値書式指定文字列 です。
' Char 型の "0" を作成
Dim baseFormat As Char = Char.Parse("0")

' 連続する "0" を作成
Dim zeroFormat As String = New String(baseFormat, 10)

' Char 型の "あ" を作成
Dim moji As Char = Char.Parse("あ")

' 連続する "あ" を作成
Dim many_moji As String = New String(moji, 20)
Console.WriteLine(many_moji)


' 16777215 => "0016777215"
Console.WriteLine((&HFFFFFF).ToString(zeroFormat))
Console.WriteLine(String.Format("{0:" + zeroFormat + "}", &HFFFFFF))

' 16777215 => "FFFFFFFF"
Console.WriteLine((&HFFFFFF).ToString("X"))
Console.WriteLine(String.Format("{0:X}", &HFFFFFF))

' 16777215 => "ffffffff"
Console.WriteLine((&HFFFFFF).ToString("x"))

' 16777215 => "16,777,215"
Console.WriteLine((&HFFFFFF).ToString("#,###"))

' 結果が空文字になります
Console.WriteLine("/" + (0).ToString("#,###") + "/")

' 10 は、文字列長指定
' 0 の位が # だと、0 はスペース、0だと、0 は 0
Console.WriteLine(String.Format("{0,10:#,###} : {1,10:#,##0}", 0, 0))

ああああああああああああああああああああ
0016777215
0016777215
FFFFFF
FFFFFF
ffffff
16,777,215
//
           :          0
▼ C#
char baseFormat = char.Parse("0");

string zeroFormat = new string(baseFormat, 10);

char moji = char.Parse("B");

string many_moji = new string(moji, 20);


Console.WriteLine(many_moji);
Console.WriteLine(16777215.ToString(zeroFormat));

Console.WriteLine(string.Format(("{0:" 
                    + (zeroFormat + "}")), 16777215));
Console.WriteLine(16777215.ToString("X"));

Console.WriteLine(string.Format("{0:X}", 16777215));

Console.WriteLine(16777215.ToString("x"));

Console.WriteLine(16777215.ToString("#,###"));

Console.WriteLine(("/" 
                + (0.ToString("#,###") + "/")));

Console.WriteLine(string.Format("{0,10:#,###} : {1,10:#,##0}", 0, 0));

オンライン(リアルタイム) VB=>C# ツール

関連するMicrosoft リンク

String.Format メソッド (String, Object) (System)


関連する記事


posted by lightbox at 2009-12-03 15:33 | VB.NET : ベーシック | このブログの読者になる | 更新情報をチェックする

VB.net クリップボードの処理 ( C# は注意 )

VB.net ではデフォルトで問題は出ませんが、
▼ C# では同じではエラーが出ます
ハンドルされていない例外: System.Threading.ThreadStateException: 
OLE が呼び出される前に、現在のスレッドが Single Thread Apartment
 (STA) モードに設定されていなければなりません。Main 関数に
 STAThreadAttribute が設定されていることを確認してく
ださい。
( System.Windows.Forms.Clipboard でも同じです )

Main に [System.STAThreadAttribute()] を指定します
Module MyModule

' ********************************************************
' * 実行
' ********************************************************
Sub Main()

	Dim pc As Microsoft.VisualBasic.Devices.Computer = _
		New Microsoft.VisualBasic.Devices.Computer

	pc.Clipboard.SetText("あいうえお")

	Console.WriteLine(pc.Clipboard.GetText())

End Sub

End Module

class MyModule 
{ 

	// ******************************************************** 
	// * 実行 
	// ******************************************************** 
	[System.STAThreadAttribute()]
	public static void Main() 
	{

		Microsoft.VisualBasic.Devices.Computer pc = 
			new Microsoft.VisualBasic.Devices.Computer();

		pc.Clipboard.SetText("あいうえお");

		System.Console.WriteLine(pc.Clipboard.GetText());

	} 

}
// ビルド例 : csc /r:%windir%\Microsoft.NET\Framework\v2.0.50727\Microsoft.VisualBasic.dll info.cs


関連する記事


タグ:VB.NET
posted by lightbox at 2009-12-03 13:59 | VB.NET : テクニカル | このブログの読者になる | 更新情報をチェックする

VB.net : 各種ディレクトリパスの取得 : テンポラリ/システム/特殊ディレクトリの列挙

何故か、GetTempPath で 最後に \ が付加されたので、無条件にGetDirectoryName を使用していますが、実際は、\ の有無で判断してから、処理したほうが良いと思います
' テンポラリディレクトリ( GetTempPath だと最後に \ が付加されてしまう )
Console.WriteLine( System.IO.Path.GetDirectoryName( System.IO.Path.GetTempPath() ) )

' VB的 テンポラリディレクトリ
Console.WriteLine( My.Computer.FileSystem.SpecialDirectories.Temp )

' システムディレクトリ
Console.WriteLine( Environment.SystemDirectory )

' Windows ディレクトリ
Console.WriteLine( System.IO.Path.GetDirectoryName( Environment.SystemDirectory ) )


' GetFolderPath で取得できるディレクトリ一覧
Dim Folders As Integer() = _
	Environment.SpecialFolder.GetValues(GetType(Environment.SpecialFolder))
Dim i As Integer

For i = 0 To Folders.Length - 1

	Console.WriteLine( Environment.GetFolderPath( Folders(i)) )

Next

' GetFolderPath で取得できるディレクトリ一覧とそれに対応する定義名一覧
Dim FolderNames As String() = _
	Environment.SpecialFolder.GetNames(GetType(Environment.SpecialFolder))
Dim nType As Integer

For i = 0 To Folders.Length - 1

	Console.WriteLine( FolderNames(i) )

	nType = CType( _
		System.Enum.Parse(GetType(Environment.SpecialFolder),FolderNames(i)), _
		Integer _
	)

	Console.WriteLine( Environment.GetFolderPath( nType ) )

Next

Desktop
C:\Documents and Settings\lightbox\デスクトップ
Programs
C:\Documents and Settings\lightbox\スタート メニュー\プログラム
Personal
C:\Documents and Settings\lightbox\My Documents
MyDocuments
C:\Documents and Settings\lightbox\My Documents
Favorites
C:\Documents and Settings\lightbox\Favorites
Startup
C:\Documents and Settings\lightbox\スタート メニュー\プログラム\スタートアップ
Recent
C:\Documents and Settings\lightbox\Recent
SendTo
C:\Documents and Settings\lightbox\SendTo
StartMenu
C:\Documents and Settings\lightbox\スタート メニュー
MyMusic
C:\Documents and Settings\lightbox\My Documents\My Music
DesktopDirectory
C:\Documents and Settings\lightbox\デスクトップ
MyComputer

Templates
C:\Documents and Settings\lightbox\Templates
ApplicationData
C:\Documents and Settings\lightbox\Application Data
LocalApplicationData
C:\Documents and Settings\lightbox\Local Settings\Application Data
InternetCache
C:\Documents and Settings\lightbox\Local Settings\Temporary Internet Files
Cookies
C:\Documents and Settings\lightbox\Cookies
History
C:\Documents and Settings\lightbox\Local Settings\History
CommonApplicationData
C:\Documents and Settings\All Users\Application Data
System
C:\WINDOWS\system32
ProgramFiles
C:\Program Files
MyPictures
C:\Documents and Settings\lightbox\My Documents\My Pictures
CommonProgramFiles
C:\Program Files\Common Files


関連する記事


タグ:VB.NET
posted by lightbox at 2009-12-03 12:19 | VB.NET : ベーシック | このブログの読者になる | 更新情報をチェックする

VB.net : アプリケーションを開始した実行可能ファイルのパス

アセンブリ名(拡張子なし)はファイル名を変更しても変わりませんが
この場合はファイル名そのものを指します

※ My.Application.Info.AssemblyName
Console.WriteLine( System.Windows.Forms.Application.ExecutablePath )



関連する記事


タグ:VB.NET
posted by lightbox at 2009-12-03 11:09 | VB.NET : ベーシック | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します
container 終わり



フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり