tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルCreateDC実行でプログラムがダウンする
記事No12939
投稿日: 2008/08/22(Fri) 01:47
投稿者蒼月
先日はお世話になりました。

印刷はできたのですが、また困ったことが起こってしまいました。

VB6.0の開発環境では、特に問題無く、印字が行えるのですが、
実行ファイルを作成し、それを実行すると、
エラー内容をMicrosoftに送信するかどうかの確認ダイアログが表示され、
そのままプログラムがダウンしてしまいます。

メッセージボックスなどを使って、どこが原因かを調べたところ、
CreateDCの前のメッセージボックスまでは表示されましたが、
その後が表示されずプログラムダウンすることから、
CreateDCの実行時にダウンすることまではわかりました。

ですが、開発環境では問題無く動作しているので、原因が良くわかりません。
連続の投稿となってしまいますが、どうかお力添えをお願いします。

開発環境は、VB6.0SP6で、実行環境は、XPSP3です。

ネットで調べたところ、関数の宣言が原因で
似たような現象になっている記事を見つけたので、
前回の魔界の仮面弁士さんのレスを元に、
関数宣言を何度か変更して実行してみましたが、
結果は変わらずでした。

[ツリー表示へ]
タイトルRe: CreateDC実行でプログラムがダウンする
記事No12940
投稿日: 2008/08/22(Fri) 06:52
投稿者花ちゃん
> ですが、開発環境では問題無く動作しているので、原因が良くわかりません。
関数の引数の型や使用したハンドルの削除忘れ等どこかプログラムが間違っていませんか?
その辺が解らないと何とも答えようがありません。
関数の戻り値を含め再確認して下さい。

関数の宣言時
Private Declare Function CreateDC Lib "gdi32" Alias "CreateDCA" ( _
   ByVal lpDriverName As String, _
   ByVal lpDeviceName As String, _
   ByVal lpOutput As Long, _
   ByVal lpInitData As Long) As Long

関数の使用時
Phdc = CreateDC(Printer.DriverName, Printer.DeviceName, 0&, 0&)

ハンドルの削除
lngResult = DeleteDC(Phdc)

> 開発環境は、VB6.0SP6で、実行環境は、XPSP3です。
環境を書くなら、双方の環境を統一して詳しく書かないと違いが見ている人には
解りません。(プログラムでもこのように比較していると疑ってしまう)
(開発環境は、VB で、実行環境は、OS の環境では)

[ツリー表示へ]
タイトルRe^2: CreateDC実行でプログラムがダウンする
記事No12947
投稿日: 2008/08/23(Sat) 01:30
投稿者蒼月
> > ですが、開発環境では問題無く動作しているので、原因が良くわかりません。
> 関数の引数の型や使用したハンドルの削除忘れ等どこかプログラムが間違っていませんか?
> その辺が解らないと何とも答えようがありません。
> 関数の戻り値を含め再確認して下さい。
その辺は何度も確認しましたので、問題ないと思います。
戻り値についてですが、CreateDCで戻り値が戻る前にプログラムダウンするため、確認することができません。

MsgBox "CreateDC開始"
Phdc = CreateDC(Printer.DriverName, Printer.DeviceName, 0&, 0&)←ここでダウンする
MsgBox "CreateDC終了" & Phdc ←ここまで来ない


> 関数の宣言時
> Private Declare Function CreateDC Lib "gdi32" Alias "CreateDCA" ( _
>    ByVal lpDriverName As String, _
>    ByVal lpDeviceName As String, _
>    ByVal lpOutput As Long, _
>    ByVal lpInitData As Long) As Long
>
> 関数の使用時
> Phdc = CreateDC(Printer.DriverName, Printer.DeviceName, 0&, 0&)
>
> ハンドルの削除
> lngResult = DeleteDC(Phdc)
宣言、使用、ハンドルの削除全て、上記の形を使用してやってみましたが、結果は変わりませんでした。

> > 開発環境は、VB6.0SP6で、実行環境は、XPSP3です。
> 環境を書くなら、双方の環境を統一して詳しく書かないと違いが見ている人には
> 解りません。(プログラムでもこのように比較していると疑ってしまう)
> (開発環境は、VB で、実行環境は、OS の環境では)

書き方が悪かったですね。

開発、実行ファイルの実行ともに、OSはWindows XP SP3
そして、開発環境は、VB6.0SP6を使っています。

[ツリー表示へ]
タイトルRe^3: CreateDC実行でプログラムがダウンする
記事No12948
投稿日: 2008/08/23(Sat) 02:30
投稿者花ちゃん
> その辺は何度も確認しましたので、問題ないと思います。

そう言われると原因は、私には解りません。

実際に使用している関数の宣言をコピーしてここへ貼り付けてもらわないと。

Declare Function CreateDC Lib "gdi32.dll" Alias "CreateDCA" _
    (ByVal lpszDrive As String, ByVal lpszDevice As String, _
    ByVal lpszOutput As Long, lpInitData As Any) As Long

または、

Private Declare Function CreateDC Lib "gdi32" Alias "CreateDCA" ( _
   ByVal lpDriverName As String, _
   ByVal lpDeviceName As String, _
   ByVal lpOutput As Long, _
   lpInitData As Long) As Long

上記のような宣言になっているとそのように落ちてしまいます。


>開発、実行ファイルの実行ともに、OSはWindows XP SP3
>そして、開発環境は、VB6.0SP6を使っています。

肝心なのは、開発環境と実行環境の違いなので、実行環境のVBのSP はどうなっているのか
を書かないと比較にならないと言っているのです。
又、使用しているプリンター等を含めどこが違うのかを調べないと。

プログラムに問題があるのか、環境に問題があるのか判断できないかと思います。
それらを違いがないと言われれば、...。!

http://www.hanatyan.sakura.ne.jp/patio/read.cgi?mode=view2&f=103&no=2

[ツリー表示へ]
タイトルRe^3: CreateDC実行でプログラムがダウンする
記事No12949
投稿日: 2008/08/23(Sat) 06:37
投稿者花ちゃん
Form1 に下記コードを貼り付けて実行しても同様に落ちますか?

Option Explicit

Private Declare Function CreateDC Lib "gdi32" Alias "CreateDCA" ( _
   ByVal lpDriverName As String, _
   ByVal lpDeviceName As String, _
   ByVal lpOutput As Long, _
   ByVal lpInitData As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" ( _
   ByVal hdc As Long) As Long

Private Sub Command1_Click()
   Dim Phdc As Long
   Dim Ret  As Long
   Phdc = CreateDC(Printer.DriverName, Printer.DeviceName, 0&, 0&)
   MsgBox "Phdc: " & Phdc & "  Printer.DeviceName : " & Printer.DeviceName
   Ret = DeleteDC(Phdc)
End Sub

[ツリー表示へ]
タイトルRe^3: CreateDC実行でプログラムがダウンする
記事No12950
投稿日: 2008/08/23(Sat) 11:43
投稿者魔界の仮面弁士
> その辺は何度も確認しましたので、問題ないと思います。
次回質問時からは、Declare 部と呼び出し部の両方を投稿していただけますでしょうか。
そうすれば、コードに問題が無いという事が、掲示板を見ている第三者にも確認できます。


> MsgBox "CreateDC開始"
> Phdc = CreateDC(Printer.DriverName, Printer.DeviceName, 0&, 0&)←ここでダウンする
> MsgBox "CreateDC終了" & Phdc ←ここまで来ない
個人的な予想では、ByVal / ByRef の間違いで落ちている可能性が高いと思います。

ただし必ずしも、その原因が上記 CreateDC だけにあるとは限りません。
API の使い方を間違えている箇所があると、そのあおりで、他の場所のデータまでが
まきこんで破壊されてしまう可能性がありえるためです。

特に、開発環境ではたまたま動いてしまっていたものが、コンパイルによる
最適化によって、問題が顕在化するというケースもあります。


> 宣言、使用、ハンドルの削除全て、上記の形を使用してやってみましたが、結果は変わりませんでした。
それは、既存のプロジェクトの修正でしょうか? もしそうであれば、新規プロジェクトを
立ち上げ、CreateDC / RelaseDC するだけのテストアプリを作って試してみてください。

それで問題が無ければ、元プログラムの他の個所に原因があるのかも知れません。
あるいは、テスト PG を作ってみても、やはりエラーで先に進めないのであれば、
そのコードを、そのまま掲示板にコピー & ペーストして投稿してみてください。

現象を再現可能なコードがあれば、掲示板を見ている第三者も動作をテストできるので、
環境の問題なのか、コードの問題なのか、あるいは製品のバグなのか、具体的な
問題の切り分けを行いやすくなります。

[ツリー表示へ]
タイトルRe: CreateDC実行でプログラムがダウンする
記事No12962
投稿日: 2008/08/25(Mon) 14:32
投稿者K.J.K.
> 戻り値についてですが、CreateDCで戻り値が戻る前にプログラムダウンするため、
> 確認することができません。

10年以上前の情報なのでかなりあやふやですが、表記に問題が無くてもエラーが
発生するケースが極まれに存在することがありうる、という情報を読んだ覚えが
あります。

多分、VB4時代だと思うのですが、 Printer.DeviceName が CreateDC の引数には
なりえない値を返すケースがある、というものでした。

まぁ、これではないとは思いますが、念のため書いておきます。
# もしこれならば、 EnumPrinters などを使用して直接取得した値を用いることで
# 回避は可能です。

[ツリー表示へ]
タイトルRe^2: CreateDC実行でプログラムがダウンする
記事No12964
投稿日: 2008/08/25(Mon) 23:40
投稿者蒼月
返信、ありがとうございます。
蒼月です。

結論から言いますと、ダウンしないようにはなりました。

花ちゃんさんの返信してくださった、
サンプルを新規のプロジェクトに貼り付けたところ、
問題なく動作したため、
そこに既存のプロジェクトのコードを貼り付けたところ、
うまく動作しました。

花ちゃんさん
サンプルの投稿ありがとうございました。
おかげ様で、何とか先に進むことができそうです。
また、開発環境と実行環境の件に関してですが、
どちらも同じPCだということが言いたかったのですが、
重ね重ね、説明が不足していて、申し訳ありませんでした。

魔界の仮面弁士さん
次回からは、仰られる通りに、自分のコードを貼り付ける形で質問しようと思います。

K.J.K.さん
貴重なご意見ありがとうございます。
そんなこともあるんですね。
既存の(自分が作ったわけではない)関数だから、
大丈夫なはずという思い込みも危険ですね。

うーん・・・。
しかし、私はこういうケースが多いです。

プログラムがダウンして、原因を突き止めようと
MsgBoxを入れたらなぜか正常に動作するとか・・・。

[ツリー表示へ]