[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2007/04/18(Wed) 18:30
投稿者名:ろん
Eメール:
URL :
タイトル:
選択したフォルダを表示させるアプリの不具合について
皆様はじめまして、ろんと申します。
以下にVB6で作っているアプリの不具合につきまして
ご質問させていただきます。

OS:WinXP、VB6の環境で
フォームにラベル1つ、ボタン一つ用意して
ボタンが押されたら、フォルダ選択のダイアログを表示して
選択した時にそれをフォームのラベルに表示するアプリを作っています。

処理は、全てうまくいっていたのですが
フォルダを選択するダイアログを選択するファンクションを
抜けるとVB自体が落ちてしまう(強制終了されてしまう)という
状況になってしまいました。

なぜそのような状況になってしまったかというと
全て完成してセットアップをディストリビューションウィザードで作成して
テストでそのセットアップを実行して動かしてみたのですが、途中でアプリが落ちるという
状況で正常稼動しませんでした。

その為、そのセットアップされたものをアンインストールしました。
その時に何か重要なものが消されたのかも知れませんが
それ以降、VB開発環境上からも動かなくなってしまいました。

以下にモジュールを貼らせて頂きますので
識者の皆様、何が悪いのか何か足りないのか、ご助言頂けますでしょうか。
よろしくお願い致します。

【フォームのボタンクリックイベント】

Public Sub Command1_Click()
    Form1.Label1 = GetFolderPathName("1")
End Sub

【フォルダ選択をするモジュール】
Option Explicit
Option Private Module

Type BROWSEINFO
  hwnd As Long
  pidlRoot As Long
  pszDisplayName As String
  myTitle As String
  opFlags As Long
End Type

Public Const BIF_BROWSEFORCOMPUTER = 1

Public Declare Function SHBrowseForFolder Lib "shell32.dll" _
  Alias "SHBrowseForFolderA" (lpBROWSEINFO As BROWSEINFO) As Long

Public Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias _
  "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal pszPath As String) As Long

Public Declare Function SHFree Lib "shell32" Alias "#195" (ByVal pidl As Long) As Long

Public Function GetFolderPathName(Optional myprompt As String) As String
  Dim typBROWSEINFO As BROWSEINFO
  Dim LngPit As Long
  Dim strPathName As String
  Dim letter As String
  Dim xx As Long

  letter = "フォルダを指定します。"

  With typBROWSEINFO
    .myTitle = letter
    .opFlags = BIF_BROWSEFORCOMPUTER
  End With

  LngPit = SHBrowseForFolder(typBROWSEINFO)

  If LngPit = 0 Then Call SHFree(LngPit): GetFolderPathName = "": Exit Function

  strPathName = String$(256, Chr(0))

  SHGetPathFromIDList LngPit, strPathName

  Call SHFree(LngPit)

  For xx = 1 To 256
    If Mid(strPathName, xx, 1) = Chr(0) Then
      GetFolderPathName = Left(strPathName, xx - 1)
      Exit For
    End If
  Next xx

End Function

以上、よろしくお願い致します。

投稿時間:2007/04/18(Wed) 19:07
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: 選択したフォルダを表示させるアプリの不具合について
> Option Private Module
Office の VBA (Visual Basic for Applications) をお使いなのでしょうか?
単体の VB6 (Visual Basic 6.0) をお使いなら、この宣言は無意味だと思いますが…。


> Type BROWSEINFO
>   hwnd As Long
>   pidlRoot As Long
>   pszDisplayName As String
>   myTitle As String
>   opFlags As Long
> End Type
BROWSEINFO ユーザ定義型の宣言が、
BROWSEINFO 構造体と異なっていますね。これが最大の問題かと。


> With typBROWSEINFO
オーナウィンドウなども指定しましょう。


>   LngPit = SHBrowseForFolder(typBROWSEINFO)
>   If LngPit = 0 Then Call SHFree(LngPit): GetFolderPathName = "": Exit Function
ここで、『Call SHFree(0)』を呼び出している理由は何ですか?


>   For xx = 1 To 256
>     If Mid(strPathName, xx, 1) = Chr(0) Then
ループせずとも、InStr 関数を使えばすむのでは。

投稿時間:2007/04/19(Thu) 09:26
投稿者名:ろん
Eメール:
URL :
タイトル:
Re^2: 選択したフォルダを表示させるアプリの不具合について
魔界の仮面弁士様

> > Type BROWSEINFO
> >   hwnd As Long
> >   pidlRoot As Long
> >   pszDisplayName As String
> >   myTitle As String
> >   opFlags As Long
> > End Type
> BROWSEINFO ユーザ定義型の宣言が、
> BROWSEINFO 構造体と異なっていますね。これが最大の問題かと。
>

適切なご指摘ありがとうございます。
足りない?なくなった宣言を3つ追加し
正常稼動致しました。

> > Option Private Module
> Office の VBA (Visual Basic for Applications) をお使いなのでしょうか?
> 単体の VB6 (Visual Basic 6.0) をお使いなら、この宣言は無意味だと思いますが…。
>
単体のVB6 を使用しておりました。
勉強不足です。

>
> > With typBROWSEINFO
> オーナウィンドウなども指定しましょう。
>

はい、わかりました。

>
> >   LngPit = SHBrowseForFolder(typBROWSEINFO)
> >   If LngPit = 0 Then Call SHFree(LngPit): GetFolderPathName = "": Exit Function
> ここで、『Call SHFree(0)』を呼び出している理由は何ですか?
>

そうですね、おかしいです。
>
> >   For xx = 1 To 256
> >     If Mid(strPathName, xx, 1) = Chr(0) Then
> ループせずとも、InStr 関数を使えばすむのでは。

もう少し効率の良いものを作るように致します。
当初の問題が解決いたしました。
ありがとうございました。