1

最近、VB6 アプリケーションのバグを修正しましたが、正確に何が問題なのかわかりません。

問題の部分は、 の間違った API 宣言でしCreateEventた。これは、API Viewer が生成したものです。

Declare Function CreateEvent Lib "kernel32" Alias "CreateEventA" 
(lpEventAttributes As SECURITY_ATTRIBUTES, ...) As Long

次は間違った宣言です。明らかに誰かが構造をインポートしたくありませんでしたSECURITY_ATTRIBUTES...

Declare Function CreateEvent Lib "kernel32" Alias "CreateEventA" 
(lpEventAttributes As Any, ...) As Long

呼び出しは次のとおりです。

Event = CreateEvent(Nothing, 0, 0, "MyEventName")

この呼び出しは常にIDE で機能しましたが、コンパイルされた .exe からは機能しませんでした。(CreateEvent常に 0 を返します)

宣言を次のように変更しました。

Declare Function CreateEvent Lib "kernel32" Alias "CreateEventA" 
(ByVal lpEventAttributes As Any, ...) As Long

...そしてそれはうまくいきました。

今、私は少し困惑しています:

  • ByRefを使用するときのパラメータが、使用するときSECURITY_ATTRIBUTESでなければならないのはなぜですか?ByValAny
  • IDE で間違った宣言が常に機能するのはなぜですか?
4

1 に答える 1

3

修飾されていない As Any パラメーターを使用する場合は、Call で明示的に指定する必要があります。これで問題は解決したはずです:

Event = CreateEvent(ByVal 0&, 0, 0, "MyEventName")

ここで使用する理由がわかりませんNothing。これはオブジェクト参照であり、呼び出しにはポインターが必要だからです。何をするかとByVal 0&いうと、null ポインターを渡すことです。null であるため、何を指しているのか (していないのか) は問題ではありません。Nothing ByValしかし、おそらくforce を渡すとByVal 0&、それが機能した理由です。

なぜ IDE で機能したのかというと、IDE はこのようなことに対してより寛容な傾向があります。

于 2010-02-04T13:17:22.070 に答える