[リストへもどる]
一括表示

投稿時間:2003/06/03(Tue) 14:06
投稿者名:あおい
Eメール:
URL :
タイトル:
ShellExecuteAの「オーバーフロー」エラーについて
はじめまして。

ShellExecuteAでテキストファイルを開こうとしているのですが、
「オーバーフローしました」とエラーメッセージが表示され
テキストファイルを開けません。
なにが「オーバーフロー」なのかを調べましたが
分かりませんでした。

申し訳ございませんが、どうか教えてください。

よろしくお願いいたします。

投稿時間:2003/06/03(Tue) 14:27
投稿者名:nobu
Eメール:
URL :
タイトル:
Re: ShellExecuteAの「オーバーフロー」エラーについて
> ShellExecuteAでテキストファイルを開こうとしているのですが、
> 「オーバーフローしました」とエラーメッセージが表示され
> テキストファイルを開けません。

実際のコードを提示した方が回答が付きやすいと思いますが。

下記の 「ShellExecuteEx使用」では上手く表示されますが。

http://www.geocities.co.jp/SiliconValley/4805/vbtips/vbtips040.htm

投稿時間:2003/06/03(Tue) 16:34
投稿者名:あおい
Eメール:
URL :
タイトル:
Re^2: ShellExecuteAの「オーバーフロー」エラーについて
nobuさん
お忙しいところご回答ありがとうございます。

ソースを簡単ですが記載させていただきます。
<basファイルに記載>
Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

<Formモジュールに記載>
Mret = ShellExecuteA(Me.hwnd, "open", FName, vbNullString, App.Path & "\", SNORMAL%)
SNORMAL%には1を設定しております。

このFormではボタンを押下するとtxtファイルを作ります。
そのテキストファイルを表示するプログラムです。
ファイルは作成されております。
開くことも可能ですがプログラムからですと
オーバーフローしましたとエラーメッセージが表示されます。
ファイル名・ファイルのパスも合っています。
この行になるとステップ実行でエラーハンドラーに入ってしまいます。

どうか、皆様のお知恵をおかしください。
よろしくお願いいたします

投稿時間:2003/06/03(Tue) 16:39
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^3: ShellExecuteAの「オーバーフロー」エラーについて
> Mret = ShellExecuteA(Me.hwnd, "open", FName, vbNullString, App.Path & "\", SNORMAL%)

SNORMAL% がInteger 型になっているからだと思われます。
Long型に変更して見てください

投稿時間:2003/06/03(Tue) 17:02
投稿者名:nobu
Eメール:
URL :
タイトル:
Re^3: ShellExecuteAの「オーバーフロー」エラーについて
すでに「花ちゃん 」さんが適切なフォローをしてくれています。
これも、コードがあれば直ぐに原因を見つけてくれます。

ちなみに型宣言文字に付いて調べて置く方が良いですよ。
% Integer
& Long
! Single
# Double
@ Currency

投稿時間:2003/06/04(Wed) 10:14
投稿者名:あおい
Eメール:
URL :
タイトル:
変更しましたが同じエラーがでます。
花ちゃん 様
nobu 様

お忙しいところご回答ありがとうございます。
ご連絡が遅くなり申し訳ありませんでした。

確かに、ご指摘のあった通りintegerで宣言しておりましたので修正しました。
ですが、同じオーバーフローしましたというエラーがでます。
私はVB5 windows2000を用いて作成しております。

このShellExecuteAの関数を呼び出しているところにブレークポイントを貼り、
そこまで実行してもエラーハンドラーにはいきませんが、
そこからステップ実行するとすぐエラーハンドラーに移行して
この「オーバーフローしました」というエラーがでます。
私は、このことからShellExecuteAのエラーと考えておりますが
このような場合でもShellExecuteA以外のエラーが起こることもあるのでしょうか?

ご教授よろしくお願いいたします。

投稿時間:2003/06/04(Wed) 11:26
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: 変更しましたが同じエラーがでます。
もう一箇所間違っていました。
>Mret = ShellExecuteA(Me.hwnd

Mret = ShellExecute(Me.hwnd 

でも、これならエラーメッセージが違うし?
一度再現できる全体のコードを作って投稿して見て下さい。
(ファイルパス等は直接指定するようにして)
又はここの関連付け起動を試して見るとか。

投稿時間:2003/06/04(Wed) 12:10
投稿者名:あおい
Eメール:
URL :
タイトル:
Re^2: 変更しましたが同じエラーがでます。
花ちゃん 様

お手数をおかけしてしまい申し訳ありません。

> もう一箇所間違っていました。
> >Mret = ShellExecuteA(Me.hwnd
>
>  Mret = ShellExecute(Me.hwnd 
とのことですが、すごい初歩的なことをお聞きしてしまうかもしれませんが
Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

Declare Function ShellExecuteA Lib "shell32.dll" (ByVal hwnd As Integer, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Integer) As Integer

とbasファイルで指定しております。
ここの初めのShellExecuteAをShellExecuteにすると Alias "ShellExecuteA"自体が自動的に
削除されてしまいます。
また、下のShellExecuteAをShellExecuteにして、
Mret = ShellExecute(Me.hwnd 
とするとコンパイルエラーが発生します。

basファイルの時にはShellExecuteAのままで呼び出すときのみShellExecuteにするとエラーは
おきませんでした。
basファイルのおける宣言と呼び出す関数名がことなってもいいのでしょうか?
(すごい初心者的な考えですが、同じでないと呼び出せないと思っております。)

お手数をおかけいたしますが、どういう仕組みなのか知りたいので
どこをどんな風にしらべると分かるかを教えていただけませんでしょうか?

重ね重ねお手数をおかけいたしますがよろしくお願いいたします。

投稿時間:2003/06/04(Wed) 12:30
投稿者名:Lantern
Eメール:
URL :
タイトル:
Re^3: 変更しましたが同じエラーがでます。
DeclareはVB内で使用するための関数定義。
Aliasはshell32.dll内での定義。(defファイルで定義)

"ShellExecuteA"を"ShellExecute"にするとAliasが消えるのはVB内・Dll定義名が
同じと判断されたからです。

また、Alias無しでShellExecuteで定義した際にコンパイルエラーになるのは
Dll内でShellExecuteとして定義されていないので呼び出しエラーになったためです。

なので、↓のような定義でもShellExecuteAは呼び出せたりします。
Declare Function abc Lib "shell32.dll" Alias "ShellExecuteA" (以下略

Call abc(Me.hWnd, 以下略

投稿時間:2003/06/04(Wed) 13:43
投稿者名:あおい
Eメール:
URL :
タイトル:
Re^4: 変更しましたが同じエラーがでます。
Lantern 様

お忙しいところご回答ありがとうございます。

> なので、↓のような定義でもShellExecuteAは呼び出せたりします。
> Declare Function abc Lib "shell32.dll" Alias "ShellExecuteA" (以下略
>
> Call abc(Me.hWnd, 以下略

やっと理解できました。
ありがとうございました。
VBのヘルプを見たのですがいまいち分からなくて困っていました。
ありがとうございました。

あと申し訳ないのですがもう1点教えてください。
なにがオーバーフローしてしまったのでしょうか?
呼び出した"ShellExecuteA"の関数定義が間違っていたのならば
オーバーフローのエラーはでないと思うのですが・・・・・。

お手数をおかけして申し訳ございませんが
あと一歩ご教授お願いいたします。

投稿時間:2003/06/04(Wed) 13:54
投稿者名:Lantern
Eメール:
URL :
タイトル:
Re^5: 変更しましたが同じエラーがでます。
Option Explicit
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Private Sub Form_Load()
    Dim ret As Long
    ret = ShellExecute(Me.hwnd, "open", "test01.txt", vbNullString, "C:\", 1&)
End Sub

私の環境で上記ソースで動作させていますが、問題なく起動できています。
新規作成→標準EXE でできたプロジェクトに上記ソースをそのまま貼り付けて
あおいさんの現象が発生するのか試していただけますか?
その際にテキストファイル"test01.txt"を"C:\"に置いてください。

投稿時間:2003/06/04(Wed) 14:51
投稿者名:あおい
Eメール:
URL :
タイトル:
ShellExecuteAを呼び出してはいけないのですか?
Lantern 様
花ちゃん様

お手数をおかけして申し訳ございません。
No4273のLantern 様のご教授どおりに記載すると稼動いたします。
ただ、私の初期ソース(long型の間違え修正後)ではShellExecuteAで
以下のソースのように記載しておりましたためオーバーフローエラーが発生しました。
No4265のLantern 様のコメントをよんでShellExecuteで呼び出し可能いうことが
分かりました。
そこで、私は呼び出しても可能ということは通常ではやはりShellExecuteAで呼び出すのだと
思ったのです。

下記のソースのShellExecuteAをShellExecuteにすると動きます。
ということは、ShellExecuteAで呼び出すこと間違えということなのでしょうか?
間違えの場合、2.の宣言はいらないのでしょうか??

(上記の説明の為宣言に番号を振りましたが、実際のソースにはこの番号は記載しておりません)
1.Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd   As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As      String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
2.Private Declare Function ShellExecuteA Lib "shell32.dll" (ByVal hwnd As Integer, ByVal    lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal      lpDirectory As String, ByVal nShowCmd As Integer) As Integer

Private Sub Command1_Click()
    Dim ret As Long
    ret = ShellExecuteA(Me.hwnd, "open", "test01.txt", vbNullString, "C:\", 1&)

End Sub

ShellExecuteAにこだわっているわけではないのですが、どうしてShellExecuteAで呼び出してはいけないかが
わからないんです。
理解能力が乏しくて申し訳ございません。
今一度、ご教授をお願いいたします。

投稿時間:2003/06/04(Wed) 15:01
投稿者名:Lantern
Eメール:
URL :
タイトル:
Re: ShellExecuteAを呼び出してはいけないのですか?
> 2.Private Declare Function ShellExecuteA Lib "shell32.dll" (ByVal hwnd As Int
eger, ByVal    lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String,
ByVal      lpDirectory As String, ByVal nShowCmd As Integer) As Integer
第一引数 hwnd as Integer → Long
第六引数 nShowCmd as Integer → Long
戻り値  Integer → Long

定義部分をどこからコピーされたか分かりませんが、定義が間違っています。
APIビューアを使用するように心がけましょう。

なお、VCのint型はVBのInteger型とはサイズが異なるので対応していません。
VCのintはVBのLongで受けます。

投稿時間:2003/06/04(Wed) 16:44
投稿者名:あおい
Eメール:
URL :
タイトル:
理解できました!!皆様ほんとうにありがとうございました。
nobu 様 花ちゃん様 Lantern 様 Starfish 様
本当にありがとうございました。
2.で記載した関数の引数の型と戻り値の型がちがっていたのですね。
ああ。。。なんと恥ずかしい。
(私が作成してないとはいえ・・・・もっとよく見るべきでした。すいません。)

でも、皆様のおかげてとても勉強になりました。
ShellExecuteAをShellExecuteとして呼び出せるなんてしりませんでした。
スレッドが長くなってしまって本当に申し訳ありません。

引数を直したところ、きちんと動きました。
皆様・・・本当に本当にありがとうございました。
これからは引数にもっと注意いたします。
ありがとうございましたm(._.)m

投稿時間:2003/06/04(Wed) 12:43
投稿者名:Starfish
Eメール:
URL :
タイトル:
Re: 変更しましたが同じエラーがでます。

> 確かに、ご指摘のあった通りintegerで宣言しておりましたので修正しました。
> ですが、同じオーバーフローしましたというエラーがでます。

 オーバーフローをしているのは、Mret の方だと思いますので、こちらを
Longに変えてみてください。

投稿時間:2003/06/04(Wed) 13:32
投稿者名:あおい
Eメール:
URL :
タイトル:
Re^2: 変更しましたが同じエラーがでます。
Starfish 様

お忙しいところご回答ありがとうございます。

> > 確かに、ご指摘のあった通りintegerで宣言しておりましたので修正しました。
> > ですが、同じオーバーフローしましたというエラーがでます。
>
>  オーバーフローをしているのは、Mret の方だと思いますので、こちらを
> Longに変えてみてください。

はい。私もまずはそう思いましたが、このMretはもともとlong型で宣言している為
オーバーフローしていないのです。
記載がなくて申し訳ありませんでした。
次回からはきちんとすべて記載するようにいたします。
ご回答、本当にありがとうございました。