tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルVB起動OKもEXE起動NG
記事No14576
投稿日: 2010/03/29(Mon) 14:38
投稿者クン
VB 6.0で実行(F5)するとOKなのに、
EXEダブルクリックだとメールスロット生成でエラーとなります。

'自メールスロットの生成
Ene_MsHandle = CreateMailslot(ENE_MS_DATAMAN, ENE_MAX_RCVBUF, _
                              ENE_RCV_TIMEOUT, Null)
If Ene_MsHandle <> INVALID_HANDLE_VALUE Then
    'スケジュールファイルの読み込み
    Call Ene_GetScheduleFileInfo
    'フォーム表示
    Me.Show
Else
    Beep
    MsgBox "メールスロットの生成に失敗しました。" _
            & vbCrLf & "[" & ENE_MS_DATAMAN & "]", _
            vbInformation + vbOKOnly, Me.Caption
            wRet = False
End If
※#define ENE_MS_DATAMAN "\\.\mailslot\Ene_Ms_DataMan"

何か相違があるのでしょうか?

[ツリー表示へ]
タイトルRe: VB起動OKもEXE起動NG
記事No14577
投稿日: 2010/03/29(Mon) 15:16
投稿者魔界の仮面弁士
開発環境で動いていたものが、EXE で動作が異なってしまうような
場合には、ネイティブ コード コンパイルから P-Code コンパイルに
変更することで解決する事が多いようです。
http://support.microsoft.com/kb/229415/ja
http://salvw.miscnotes.com/index.php/archives/category/_vb/pcodeandnativecode

ただし今回のように、API 使用時に動作が異なってしまった場合というのは、
API 関数の宣言や呼び出し方など、元のソースに問題があると見たほうが良いでしょう。


> '自メールスロットの生成
> Ene_MsHandle = CreateMailslot(ENE_MS_DATAMAN, ENE_MAX_RCVBUF, _
>                               ENE_RCV_TIMEOUT, Null)
第 4 引数に Null を指定してはいけません。
ここに指定するべきは、『SECURITY_ATTRIBUTES 構造体への参照』です。

もしも第 4 引数を、Declare 時に「ByRef As Any」または「ByVal As Long」で
宣言しているのであれば、呼び出し時には「ByVal 0&」と指定してみてください。

あるいは、「ByRef As SECURITY_ATTRIBUTES」と宣言している場合には、
第 4 引数には、「SECURITY_ATTRIBUTES 型の変数」を渡す必要があります。



>  ENE_RCV_TIMEOUT, Null)
「C 言語の NULL」と、「Visual Basic の Null」を混同しないようにしてください。
http://hpcgi1.nifty.com/MADIA/VBBBS2/wwwlng.cgi?print+200504/05040116.txt

VB の Null とは Variant 型専用の値であり、API で使用されることはまずありません。
OLE 関係の API で利用されることはありますけれども。


> vbInformation + vbOKOnly, Me.Caption
ビットフラグとなる定数は、「+ 演算子」ではなく「Or 演算子」で連結しましょう。

[ツリー表示へ]
タイトルRe^2: VB起動OKもEXE起動NG
記事No14578
投稿日: 2010/03/29(Mon) 15:33
投稿者クン
> ただし今回のように、API 使用時に動作が異なってしまった場合というのは、
> API 関数の宣言や呼び出し方など、元のソースに問題があると見たほうが良いでしょう。
> もしも第 4 引数を、Declare 時に「ByRef As Any」または「ByVal As Long」で
> 宣言しているのであれば、呼び出し時には「ByVal 0&」と指定してみてください。

「ByVal 0&」で上手くいきました。
魔界の仮面弁士様、何時もありがとうございます。

> 「C 言語の NULL」と、「Visual Basic の Null」を混同しないようにしてください。
> ビットフラグとなる定数は、「+ 演算子」ではなく「Or 演算子」で連結しましょう。

以後、肝に銘じ、今後の糧にしたいと思います。
重ねて、ありがとうございました。

[ツリー表示へ]