|
分類:[VB.NET/VB2005 以降]
※すいません、さきほど途中送信してしまい編集しようとしましたがうまくいかないため再投稿させて頂きます。
先日VB6からVB2005への変換で別の構造体のメンバが同時に変化する問題を質問させて頂いた者です。
その節はどうもありがとうございました。
今回別の問題を質問させて頂きます。
RS232C通信にAPIのCreateEventを使ってるところがあり、そこでひっかかるのですが、ソースは単純化すると下記のような感じです。
'APIの宣言
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Integer, ByVal dwShareMode As Integer, ByVal lpSecurityAttributes As Integer, ByVal dwCreationDisposition As Integer, ByVal dwFlagsAndAttributes As Integer, ByVal hTemplateFile As Integer) As Integer
Public Declare Function SetCommMask Lib "kernel32" (ByVal hFile As Integer, ByVal dwEvtMask As Integer) As Integer
Public Declare Function CreateEvent Lib "kernel32" Alias "CreateEventA" (ByRef lpEventAttributes As Integer, ByVal bManualReset As Integer, ByVal bInitialState As Integer, ByVal lpName As String) As Integer
'232Cオープンの関数
Public Function G_CommOpen(ByRef intCommCh As Short) As Short
'
' 機能 : ポートのオープン
'
' 返り値 : 0 - 正常
' -1 - オープン出来ない(エラー)
'
' 引き数 : intCommCh - オープンするポート番号
'
' 機能説明 : intCommCh で指定された COMポートをオープンします。
'
If G_CommHandle(intCommCh) = INVALID_HANDLE_VALUE Or G_CommHandle(intCommCh) = 0 Then
'オープンしてないポートのハンドルは、INVALID_HANDLE_VALUEに設定する
G_CommHandle(intCommCh) = INVALID_HANDLE_VALUE
Else
'既にオープン済みの場合は Exit
G_CommOpen = 1
G_lngLastErr = NO_ERROR
Exit Function
End If
'ポートのオープン
G_CommHandle(intCommCh) = CreateFile(G_COMM_PORTNAME & intCommCh, GENERIC_READ Or GENERIC_WRITE, &H0S, &H0S, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, &H0S)
If G_CommHandle(intCommCh) = INVALID_HANDLE_VALUE Then
'ハンドルの取得に失敗したら、エラーの内容を確認する
MsgBox(GetLastError)
'Call G_GetCommErrMsg("G_CommOpen()のCreateFile()")
G_CommOpen = -1
Exit Function
End If
'監視するイベントを設定
If Not CBool(SetCommMask(G_CommHandle(intCommCh), EV_MASK)) Then
MsgBox(GetLastError)
'Call G_GetCommErrMsg("G_CommOpen()のSetCommMask()")
End If
'受信用OVERLAPPED構造体を設定
lngReadHandle(intCommCh) = CreateEvent(&H0S, True, False, CStr(&H0S))
If lngReadHandle(intCommCh) = 0 Then
MsgBox(GetLastError)
Call G_GetCommErrMsg("G_CommOpen()のlngReadHandle=CreateEvent()")
End If
'ハンドルを取得できたら、エラーなし
G_CommOpen = 0
End Function
'呼び出し元
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
G_CommOpen(6)
End Sub
以上を実行すると
lngReadHandle(intCommCh) = CreateEvent(&H0S, True, False, CStr(&H0S))
の所でCreateEventが失敗します。GetLastErrorで見るとエラーコード1305となります。
1305はERROR_UNKNOWN_REVISIONのようです。
ここで
lngReadHandle(intCommCh) = CreateEvent(&H0S, True, False, CStr(&H0S))
以後を別の関数に分離しG_CommOpenSubとし、呼び出し元を
G_CommOpen(6)
G_CommOpenSub(6)
としてやると何故かエラーしません。
エラーしないのでいいかと保留にして進めたのですが、結局デバッグ環境ではよかったのですが、コンパイルしたEXEではこのエラーが再発してしまいました。
以上よろしくお願い致します。
|