日記・コラム・つぶやき

Windowsシリアル制御VB6コードサンプル

Option Explicit
Option Base 0

Public Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" ( _
    ByVal lpFileName As String, _
    ByVal dwDesiredAccess As Long, _
    ByVal dwShareMode As Long, _
    ByVal lpSecurityAttributes As Long, _
    ByVal dwCreationDisposition As Long, _
    ByVal dwFlagsAndAttributes As Long, _
    ByVal hTemplateFile As Long _
    ) As Long

'About CreateFile
'lpFileName String ファイル名 "COM1","COM2"など
'dwDesiredAccess Long オープン方法 読み書き両用にする「&H80000000 OR &H40000000」
'dwShareMode Long 共有モード 共有しない「0」
'ByRef lpSecurityAttributes SECURITY_ATTRIBUTES→ByVal Longに変更する セキュリティ属性 使用しない(宣言文の型を変更して「0」)
'dwCreationDisposition Long 既存ファイルの処理 既存のファイルをオープン「&H3」を指定する
'dwFlagsAndAttributes Long ファイルの属性 なし「0」
'hTemplateFile Long テンプレートファイル 使わない「0」

Public Declare Function GetCommState Lib "kernel32" ( _
    ByVal nCid As Long, _
    ByRef lpDCB As DCB _
    ) As Long

Public Declare Function GetCommTimeouts Lib "kernel32" ( _
    ByVal hFile As Long, _
    ByRef lpCommTimeouts As COMMTIMEOUTS _
    ) As Long

Public Declare Function GetCommProperties Lib "kernel32" ( _
    ByVal hFile As Long, _
    ByRef lpCommProp As COMMPROP _
    ) As Long

Public Declare Function GetCommMask Lib "kernel32" ( _
    ByVal hFile As Long, _
    ByRef lpEvtMask As Long _
    ) As Long

Public Declare Function GetCommConfig Lib "kernel32" ( _
    ByVal hCommDev As Long, _
    ByRef lpCC As COMMCONFIG, _
    ByRef lpdwSize As Long _
    ) As Long

Public Declare Function SetCommState Lib "kernel32" ( _
    ByVal hCommDev As Long, _
    ByRef lpDCB As DCB _
    ) As Long

Public Declare Function SetCommTimeouts Lib "kernel32" ( _
    ByVal hFile As Long, _
    ByRef lpCommTimeouts As COMMTIMEOUTS _
    ) As Long

Public Declare Function SetCommBreak Lib "kernel32" ( _
    ByVal nCid As Long _
    ) As Long

Public Declare Function SetCommConfig Lib "kernel32" ( _
    ByVal hCommDev As Long, _
    ByRef lpCC As COMMCONFIG, _
    ByVal dwSize As Long _
    ) As Long

Public Declare Function SetCommMask Lib "kernel32" ( _
    ByVal hFile As Long, _
    ByVal dwEvtMask As Long _
    ) As Long

Public Declare Function CloseHandle Lib "kernel32" ( _
    ByVal hObject As Long _
    ) As Long

Public Declare Function WaitCommEvent Lib "kernel32" ( _
    ByVal hFile As Long, _
    ByRef lpEvtMask As Long, _
    ByRef lpOverlapped As OVERLAPPED _
    ) As Long

Public Declare Function EscapeCommFunction Lib "kernel32" ( _
    ByVal nCid As Long, _
    ByVal nFunc As Long _
    ) As Long

'About EscapeCommFunction nFunc Values
Public Const SETRTS As Long = 3     'RTSをオンにする
Public Const CLRRTS As Long = 4     'RTSをオフにする
Public Const SETDTR As Long = 5     'DTRをオンにする
Public Const CLRDTR As Long = 6     'DTRをオフにする
Public Const SETXOFF As Long = 1    'XOFFを受信したときの処理
Public Const SETXON As Long = 2     'XONを受信したときの処理
Public Const SETBREAK As Long = 8   '送信をブレーク状態にする
Public Const CLRBREAK As Long = 9   '送信のブレーク状態から復帰

Public Declare Function GetCommModemStatus Lib "kernel32" ( _
    ByVal hFile As Long, _
    ByRef lpModemStat As Long _
    ) As Long

'About mask of lpModemStat
Public Const MS_CRT_ON As Long = &H10&  'CTSがオン
Public Const MS_DSR_ON As Long = &H20&  'DSRがオン
Public Const MS_RING_ON As Long = &H40& 'リングがオン
Public Const MS_RLSD_ON As Long = &H80& 'RLSD(CD)がオン

Public Type DCB
    DCBlength As Long       '構造体のサイズ
    BaudRate As Long        'ボーレート(bps)の設定・・・直接値を代入する。
                            '例:110, 150, 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 38400
    fBitFields As Long      'See About fBitFields bit position
    wReserved As Integer    'wReserved Integer 予約(0をセットする)
    XonLim As Integer       '受信バッファ中のデータが何バイトになったらXon文字を送るかを指定
    XoffLim As Integer      '受信バッファの空きが何バイトになったらXoff文字を送るかを指定
    ByteSize As Byte        '1データのビット数を指定・・・7または8
    Parity As Byte          'パリティの方式を指定
                            '0・・・NOPARITY   (パリティなし)
                            '1・・・ODDPARITY (奇数パリティ)
                            '2・・・EVENPARITY (偶数パリティ)
                            '3・・・MARKPARITY (常にマーク)
    StopBits As Byte        'ストップビット数を指定
                            '0・・・ONESTOPBIT     (1ビット)
                            '1・・・ONE5STOPBITS  (1.5ビット)
                            '2・・・TOSTOPBITS   (2ビット)
    XonChar As Byte         'Xon文字を指定
    XoffChar As Byte        'Xoff文字を指定
    ErrorChar As Byte       'パリティエラーの場合に使う文字を指定
    EofChar As Byte         '非バイナリモードの場合のデータ終了文字の指定
    EvtChar As Byte         'イベントを生成する文字を指定
    wReserved1 As Integer   '(未使用)
End Type

'About fBitFields bit position
'0 fBinary バイナリモードかどうか
'1 fParity パリティチェックの有無
'2 fOutxCtsFlow CTSを監視するかどうか
'3 fOutxDsrFlow DSRを監視するかどうか
'4,5 fDtrControl DTRによるハンドシェーク(2ビット)
'6 fDsrSensitivity TrueのときDSRがオフのときの受信データを無視する
'7 fTXContinueOnXoff Xoff文字を送信した後も送信を続けるかどうか
'8 fOutX TrueのときXoff文字を受信すると送信を停止し、Xon文字で再開
'9 fInX Trueのとき受信バッファの空きに応じてXoff、Xon文字が送信される
'10 fErrorChar Trueのときパリティエラーの処理をする
'11 fNull Trueのときヌル文字は破棄される
'12,13 fRtsControl RTSによるハンドシェーク(2ビット)
'14 fAbortOnError Trueのときエラーが発生したら読み書きを終了する
'15 fDummy2 未使用

Public Type SECURITY_ATTRIBUTES
    nLength As Long
    lpSecurityDescriptor As Long
    bInheritHandle As Long
End Type

Public Type COMMTIMEOUTS
    ReadIntervalTimeout As Long         '文字の読み込みの待ち時間
    ReadTotalTimeoutMultiplier As Long  '読み込みの1文字あたりの時間
    ReadTotalTimeoutConstant As Long    '読み込みの定数時間
    WriteTotalTimeoutMultiplier As Long '書き込みの1文字あたりの時間
    WriteTotalTimeoutConstant As Long   '書き込みの定数時間
End Type

Public Type COMMPROP
    wPacketLength As Integer        '構造体のサイズ
    wPacketVersion As Integer       '構造体のバージョン
    dwServiceMask As Long           '実装されているサービス
    dwReserved1 As Long             '予約
    dwMaxTxQueue As Long            '最大送信バッファサイズ
    dwMaxRxQueue As Long            '最大受信バッファサイズ
    dwMaxBaud As Long               '最大ボーレート
    dwProvSubType As Long           'デバイスの種類
    dwProvCapabilities As Long      'サポートされている機能
    dwSettableParams As Long        '変更可能なパラメータ
    dwSettableBaud As Long          '許されるボーレート
    wSettableData As Integer        '許されるバイトサイズ
    wSettableStopParity As Integer  '許されるストップビット/パリティの設定
    dwCurrentTxQueue As Long        '送信バッファサイズ
    dwCurrentRxQueue As Long        '受信バッファサイズ
    dwProvSpec1 As Long             'プロバイダ用
    dwProvSpec2 As Long             'プロバイダ用
    wcProvChar(1) As Integer        'プロバイダ用
End Type

'dwProvSpec2 Long
'wcProvChar(1) Integer

'About dwProvCapabilities
Public Const PCF_DTRDSR As Long = &H1&          'DTR/DSR機能
Public Const PCF_RTSCTS As Long = &H2&          'RTS/CTS機能
Public Const PCF_RLSD As Long = &H4&            'CD機能
Public Const PCF_PARITY_CHECK As Long = &H8&    'パリティチェック
Public Const PCF_XONXOFF As Long = &H10&        'XON/XOFFのフロー制御
Public Const PCF_SETXCHAR As Long = &H20&       'XON/XOFF機能の設定
Public Const PCF_TOTALTIMEOUTS As Long = &H40&  '経過時間のタイムアウト
Public Const PCF_INTTIMEOUTS As Long = &H80&    'インターバルタイムアウト
Public Const PCF_SPECIALCHARS As Long = &H100&  '特殊文字
Public Const PCF_16BITMODE As Long = &H200&     '16ビットのデータモード

Public Type COMMCONFIG
    dwSize As Long
    wVersion As Integer
    wReserved As Integer
    dcbx As DCB
    dwProviderSubType As Long
    dwProviderOffset As Long
    dwProviderSize As Long
    wcProviderData As Byte
End Type

Public Type OVERLAPPED
        Internal As Long
        InternalHigh As Long
        offset As Long
        OffsetHigh As Long
        hEvent As Long
End Type

Public Const FILE_ATTRIBUTE_ARCHIVE = &H20
Public Const FILE_ATTRIBUTE_COMPRESSED = &H800
Public Const FILE_ATTRIBUTE_DIRECTORY = &H10
Public Const FILE_ATTRIBUTE_HIDDEN = &H2
Public Const FILE_ATTRIBUTE_NORMAL = &H80
Public Const FILE_ATTRIBUTE_READONLY = &H1
Public Const FILE_ATTRIBUTE_SYSTEM = &H4
Public Const FILE_ATTRIBUTE_TEMPORARY = &H100

Public Const INVALID_HANDLE_VALUE = -1
Public Const OPEN_EXISTING = 3

'ユーザ定義
Public Const LONGBITSLEN As Integer = 32
Public Type LONGBITS
    blnBits(0 To LONGBITSLEN - 1) As Boolean
    'MSB:bnlBits(31), LSB:blnBits(0)
End Type

Public Const PORT_COM1 As String = "COM1"

Public Function ConvertLongToBits(ByVal value As Long) As LONGBITS
    Dim i As Integer
    Dim bits As LONGBITS
    Dim msb As Long
    Dim wk As Long
    msb = value And &H80000000
    wk = value And &H7FFFFFFF

    If msb <> 0 Then
        bits.blnBits(LONGBITSLEN - 1) = True
    Else
        bits.blnBits(LONGBITSLEN - 1) = False
    End If
   
    For i = 0 To LONGBITSLEN - 2
        If ((wk \ 2 ^ i) And 1) = 1 Then
            bits.blnBits(i) = True
        Else
            bits.blnBits(i) = False
        End If
    Next
    ConvertLongToBits = bits
End Function

Public Function ConvertBitsToLong(ByRef bits As LONGBITS) As Long
    Dim i As Integer
    Dim value As Long
    Dim wk As Long
   
    wk = 0
    For i = 0 To LONGBITSLEN - 2
        If bits.blnBits(i) Then
            wk = wk + 2 ^ i
        End If
    Next
   
    If bits.blnBits(LONGBITSLEN - 1) Then
        value = wk Or &H80000000
    Else
        value = wk
    End If
       
    ConvertBitsToLong = value
End Function

Public Function CheckComm(ByVal strPort As String)
    Const GENERIC_READ = &H80000000
    Const GENERIC_WRITE = &H40000000
    Const OPEN_EXISTING = 3
    Dim lpPortName As String
    Dim hComm As Long
    Dim stDCB As DCB
    Dim lngResult As Long
    Dim timeOut As COMMTIMEOUTS
    Dim nFunc As Long
    Dim lpModemState As Long
   
    'シリアルポートを開く
    lpPortName = PORT_COM1
    hComm = CreateFile(lpPortName, GENERIC_READ Or GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0)
   
    If hComm = -1 Then
        MsgBox lpPortName & "が使えません", vbCritical
        Exit Function
    End If
   
    'シリアル通信の設定
    'stDCB.BaudRate = 9600
    'stDCB.ByteSize = 8
    'stDCB.fBitFields = &H3001
    'stDCB.Parity = 0
    'stDCB.StopBits = 0
    'lngResult = SetCommState(hComm, stDCB)
   
    'タイムアウトの設定
    'timeOut.ReadIntervalTimeout = 500       '文字の読み込み待ち時間(500ms)
    'timeOut.ReadTotalTimeoutMultiplier = 0  '読み込みの1文字あたりの時間
    'timeOut.ReadTotalTimeoutConstant = 500  '読み込みの定数時間(500ms)
    'timeOut.WriteTotalTimeoutMultiplier = 0 '書き込みの1文字あたりの時間
    'timeOut.WriteTotalTimeoutConstant = 500 '書き込みの定数時間(500ms)
    'lngResult = SetCommTimeouts(hComm, timeOut)
   
   
    '信号直接制御
    nFunc = SETRTS      'RTSをオンにする
    'nFunc = CLRRTS      'RTSをオフにする
    'nFunc = SETDTR      'DTRをオンにする
    'nFunc = CLRDTR      'DTRをオフにする
    'nFunc = SETXOFF     'XOFFを受信したときの処理
    'nFunc = SETXON      'XONを受信したときの処理
    'nFunc = SETBREAK    '送信をブレーク状態にする
    'nFunc = CLRBREAK    '送信のブレーク状態から復帰
    lngResult = EscapeCommFunction(hComm, nFunc)
   
    '信号状態取得
    lngResult = GetCommModemStatus(hComm, lpModemState)
   
    If lpModemState And MS_CRT_ON Then
        'CTSがオン
    End If
    If lpModemState And MS_DSR_ON Then
        'DSRがオン
    End If
    If lpModemState And MS_RING_ON Then
        'リングがオン
    End If
    If lpModemState And MS_RLSD_ON Then
        'RLSD(CD)がオン
    End If

    'シルアルポートを閉じる
    lngResult = CloseHandle(hComm)

End Function

|

画像ビューアAlt1.13の不具合対策

リリースしたばかりのバージョン1.13だったが、早速不具合が見つかった。

一番目は、トランジション付でスライドショーを実行するとウィンドウキャプションのファイル名が切り替わらないという不具合。

二番目は、トランジション無しでスライドショーを実行すると、画像表示モードがウィンドウに合わせて拡大・縮小モードに切り替わらない不具合。

三番目は、実は、これが一番問題のある不具合だったのだが、画像表示サイズがウィンドウよりも大きい場合、隠しボタンが表示されなくなる不具合。

三番目の不具合は、隠しボタンにスライドショー実行・停止ボタンを追加する過程で発覚したもので、もし、この機能追加を今回行っていなかったら、暫らくは、そのままだった可能性もある。

まあ、とにもかくにも、日曜と月曜の2日間で対策を行い、対策版であるバージョン1.14をリリースした。

やれやれである。

とりあえず、これ以降特に不具合がでなければ、画像ビューアAltの機能追加は、一旦中断して、別の作業に着手する予定である。

その前に、ちょっと休みをとるのもいいかもね。

| | コメント (0) | トラックバック (0)

画像ビューアAlt1.13をリリース

バージョン1.12リリース後の10月2日から着手したトランジション機能の追加作業がようやく終わり、25日にバージョン1.13をリリースしました。

トランジションソースコードは、スライドショーアプレットのJavaソースコードを、VB.netに移植したもので、これ自体は1週間程度で完了。

しかし、スライドショー実行コードは、画像ビューアの他のコードに合わせる必要があったため、完全にスクラッチから起こす必要があり、コーディングに約2週間もかかってしまいました。

さて、今回追加したトランジション機能ですが、トランジション機能を有効にするには、設定ダイアログでトランジション種類をNONE以外に設定する必要があります。

お奨めは、トランジションと遷移開始端をRANDOMに、透過効果チェックボックスをオンにする設定です。また、遷移効果色は背景色と同じ色を設定しておくと良いでしょう。

この設定だと、全てのトランジション効果を楽しむことができます。

なお、メモリーが少ない場合やCPUが非力な場合でトランジションが奇麗にでない場合は、画像ビューアAltのウィンドウサイズを小さくしてからスライドショーを実行すると良いでしょう。

最新版の画像ビューアAltは、ミコソフト公式サイトからダウンロード可能です。

ミコソフト公式サイト:http://www.micosoft.jp/software/micopvalt.htm

また、11月4日頃にベクターでも最新版が公開される予定です。

ベクターサイト:http://www.vector.co.jp/soft/winnt/art/se461737.html

| | コメント (0) | トラックバック (0)

画像ビューアAlt1.12をリリース

バージョン1.7をリリースして、一段落かな…と思ったのもつかの間。

不具合やら改善すべき点やらが、色々と出てきて日単位でのリリースが続きました。

で、先日バージョン1.12をリリースして…

今のところ、不具合などは出ていません。

ちなみに、バージョン1.7以降の改善点はと言うと、

・ウィンドウサイズ変更時のスクロール基点を画像表示中央に変更。

・最大化時は、タイトルとバー表示/非表示を切り替えをできないように変更。

・最大化時にもマニュアル参照可能なように、ウィンドウを最前面にしないように変更。

・タイトルとバー表示時は、最大化時にもタイトルを表示したままにするように変更。

・タイトルとバー非表示時の動作を変更。(システムメニューを使用可能化、プレビューエリアの右上にウィンドウ操作隠しボタンを追加)

・ステータスバーに表示画像サイズ項目を追加。

・タスクアイコンメニューに、ウィンドウ操作関連のサブメニュー追加。

…と、主に操作系の改善を行ってきました。

これで、ホントに、ホントの一段落かな?

となると、いよいよ、機能系の改善に着手です。

もっとも、既に、スライドショートランジションの追加作業には入っているんですけどね。

こちらの方、スライドショーアプレット用にJavaで記述したトランジション機能のソースをVB.netに移植している最中です。

うーん、言語的な違いは、ほぼ機械的に移植できるんですが、問題は、ライブラリの違いです。

似たような、ライブラリは在るのですが、構成やら思想やらが異なるため、一筋縄では行きません。

まだまだ、頑張らないとですね。

ただ、今週の土日は、完全に休養する予定です。

来週から頑張るぞ!(笑)

| | コメント (0) | トラックバック (0)

画像ビューアAlt1.10不具合の原因

画像ビューアAlt1.7をリリース後、動作不安定なリリースが続いていたのですが、ようやく、1.10で安定したかな…

…と思っていたら、複数の画像を並べて表示後、左上の画像を最大化して、元に戻すを実行すると、最大サイズにリサイズされてしまう不具合発生。

原因は、元に戻す処理中で、フォームのボーダースタイルを設定しているのですが、タイトルとバー非表示モードの時は、ここでボーダー無しに設定します。

また、タイトルとバー非表示モードの時は、最大化状態でも、フォームのボーダーを無しに設定しています。

対策前のバージョンでは、無条件にフォームのボーダーを無しに設定してた(つまり、無しを無しに設定していた)のですが、なんと、同一設定の場合でもサイズ変更イベントが発生していたのです!

これは、完全に想定外でした。

ただ、原因が判れば対策は簡単です。

つまり、同じ値の場合は、設定しなければ良いだけですから。

という訳で、10月1日は、バージョン1.10とバージョン1.11の2回のリリースとなってしまいました。

まあ、早く対策できて良かったです。

| | コメント (0) | トラックバック (0)

画像ビューアAlt1.7リリース!

画像ビューアAltの最新バージョン1.7をリリースしました。

今回のリリースでは、ベクターレビュー記事でバージョン1.6での懸案事項となっていた、ズーム処理時の基点をプレビューウィンドウ中央にする改善や、縮小時の画像品質の改善を行っています。

最新版のバージョン1.7は、ミコソフトメインサイトからダウンロードすることができます。

| | コメント (0) | トラックバック (0)

画像ビューアAlt1.7アルファバージョン完成!

ダブルバッファを使った方式を一旦保留ににして、PictureBoxによる方法で縮小時の画質改善やズーム基点を表示矩形の中央にする改善を行ったプログラムが完成しました。

まだ、ざっと動作確認を行った段階ですが、特に問題点は出ていません。

リリースするためには、一通りの動作テストを行わなくてはなりませんが、とりあえずのアルファバージョンとしては合格です。

さてさて、もうひと頑張りです!

| | コメント (0) | トラックバック (0)

仕切りなおし

画像表示コントロールの画像ビューアAltへの組み込みを完了してテストしてみると、予想外のトラブルが発生してしまい、仕切りなおしを余儀なくされました。

というのも、画像表示サイズを大きくしてウィンドウサイズの変更操作を行うと、かなり目障りなちらつきがでるのです。

リリースまであと一歩のところなのですが、このまま提供するのには問題があります。

ただ、ダブルバッファによる方法でこのちらつきを減少させるのには、根本的な仕様から見直しが必要で時間もかかりそうであるため、とりあえず、次期バージョンについては、現行と同様にVB.netの画像表示コントロールを使用する方向で、ズーム基点の中央化ができないかを、もう一度検討してみたいと思います。

| | コメント (0) | トラックバック (0)

画像表示コントロールの単体テスト完了

画像ビューアAltの次のバージョンへ組み込む画像表示コントロールの単体テストが完了しました。

これから画像ビューアAltへの組み込み作業を行いますが、0.5人日程度の工数は、かかりそうです。

更に、組み合わせテストとデバッグに0.5人日、ドキュメントの手直しとリリース準備に0.2人日はかかりますから、23日中のリリースは微妙ですね。

とりあえず、次のバージョンでの変更点を列記すると…

1.ズーム時の基点を表示中央に変更

2.画像縮小時の画像品質の向上

3.クリップボードへコピーする画像のサイズは、その時点の表示サイズに変更

…の3点です。

3番目の変更は、当初予定していなかったのですが、画像表示コントロールを自作する過程で簡単に実装できることが判明したので、急遽、今回の変更に追加しました。

さて、もうひと頑張りです。

| | コメント (0) | トラックバック (0)

画像ビューアAltの画像表示コントロールコーディング完

画像ビューアAltの次バージョンに搭載する改良版画像表示コントロールのコーディングが完了しました。

先日からの残作業だった、画像回転と画像品質の向上、及び、マウスホイールボタンによるスクロール操作については動作確認済み。

残るは、ズーム機能とズーム時に表示中央を基点としてスクロール調整する機能の動作確認です。

ズーム機能のテストは、テスト用フォームに画像ビューアAltのズーム時長辺サイズテーブルによるズームサイズ設定機構を作りこまないといけないので少々やっかい。

だいぶ疲労もたまっているので、とりあず、一休みしてからテスト作業です。

もっとも、コントロールの開発が完了しても、本体の画像ビューアAltへの組み込みが残ってますから、あまりのんびりとはしていられないのですが…。

なんとか、23日中に本体への組み込みを終わらせたいと思っています。

| | コメント (0) | トラックバック (0)

より以前の記事一覧