C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: スタートメニュー(All Users)のパス取得


(過去ログ 81 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■48264 / inTopicNo.1)  スタートメニュー(All Users)のパス取得
  
□投稿者/ Maru (1回)-(2010/03/31(Wed) 13:28:26)

分類:[VB.NET/VB2005 以降] 

お世話になります。

VB2005 で xp,vista 向けに開発をしている初心者です。

スタートメニュー(All Users)のパスを取得するため
以下のソースを作成しました。

しかし、SHGetSpecialFolderPath で False が返ってきてしまいます。
どのようにすれば SHGetSpecialFolderPath 関数が成功するのでしょうか。

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

------------------------------------------------------------
    ' API 関数定義 
    Private Declare Function SHGetSpecialFolderPath Lib _
        "Shell32" Alias "SHGetSpecialFolderPathA" ( _
        ByVal hWnd As Long, _
        ByVal lpPath As String, _
        ByVal nFolder As Long, _
        ByVal fCreate As Boolean) As Boolean
    ' フォルダID 
    Private Const CSIDL_COMMON_PROGRAMS = 23

    ' 共通プログラムメニューのパスを取得
    Sub Main()
        Dim strTemp As String = ""
        Dim intPoint As Integer
        Dim strPath As String

        strTemp.PadLeft(256)
        ' 共通プログラムメニューのパスを取得 
        If SHGetSpecialFolderPath( _
            0, strTemp, CSIDL_COMMON_PROGRAMS, False) Then
            ' 余計なNULL文字を削除 
            intPoint = InStr(strTemp, Chr(0))
            strPath = Left(strTemp, intPoint - 1)
        End If

    End Sub



引用返信 編集キー/
■48265 / inTopicNo.2)  Re[1]: スタートメニュー(All Users)のパス取得
□投稿者/ 魔界の仮面弁士 (1587回)-(2010/03/31(Wed) 13:48:38)
No48264 (Maru さん) に返信
> 以下のソースを作成しました。
これって、VB4〜6 向けの宣言ではありませんか? (VB6 だとしても、宣言が間違っていますが)


> "Shell32" Alias "SHGetSpecialFolderPathA" ( _
できる限り、Unicode 版の API を使いましょう。
今となっては、A 系の関数が必要になるケースは非常に稀だと思います。


> ByVal hWnd As Long, _
As IntPtr と宣言してください。

> ByVal lpPath As String, _
文字列を受け取る際には、StringBuilder を使った方が良いでしょう。

> ByVal nFolder As Long, _
Long は使えません。Integer か UInteger にしてください。

> ByVal fCreate As Boolean
> ) As Boolean
間違いではありませんが、それぞれに MarshalAs(UnmanagedType.Bool) 属性を
明示的に指定しておくことをお奨めします。
http://msdn.microsoft.com/ja-jp/library/t2t3725f.aspx

> Private Const CSIDL_COMMON_PROGRAMS = 23
As 句で型を指定してください。VB2005 の場合には特に。
引用返信 編集キー/
■48266 / inTopicNo.3)  Re[2]: スタートメニュー(All Users)のパス取得
□投稿者/ みきぬ (846回)-(2010/03/31(Wed) 13:57:42)
>> Private Const CSIDL_COMMON_PROGRAMS = 23
> As 句で型を指定してください。VB2005 の場合には特に。

これは不幸のレスです。
このレスを見た人は、1週間以内に Option Strict を On にしないと、
VB神の呪いにより、プログラマとして不幸な人生を送ることになります。

ネタ元:
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=20601&forum=7&start=8
引用返信 編集キー/
■48267 / inTopicNo.4)  Re[2]: スタートメニュー(All Users)のパス取得
□投稿者/ 魔界の仮面弁士 (1588回)-(2010/03/31(Wed) 14:08:50)
No48265 (魔界の仮面弁士) に追記
>>以下のソースを作成しました。
> これって、VB4〜6 向けの宣言ではありませんか? (VB6 だとしても、宣言が間違っていますが)

VB2005 向けに書き換えてみました。CSIDL は列挙型に変更しています。

Imports System.Text
Imports System.Runtime.InteropServices
Module Module1
    Public Enum CSIDL As Integer
        '略
        COMMON_STARTMENU = 22
        COMMON_PROGRAMS = 23
        COMMON_STARTUP = 24
        '略
    End Enum
    Private Const MAX_PATH As Integer = 260
    Private Declare Auto Function SHGetSpecialFolderPath Lib "Shell32" _
       (ByVal hWnd As IntPtr, _
        ByVal lpPath As StringBuilder, _
        ByVal nFolder As CSIDL, _
        <MarshalAs(UnmanagedType.Bool)> _
        ByVal fCreate As Boolean _
       ) As <MarshalAs(UnmanagedType.Bool)> Boolean

    Public Function GetPath(ByVal folder As CSIDL) As String
        If Not System.Enum.IsDefined(GetType(CSIDL), folder) Then
            'Throw New ArgumentOutOfRangeException("folder")
        End If

        Dim path As New StringBuilder(MAX_PATH)
        If SHGetSpecialFolderPath(IntPtr.Zero, path, folder, False) Then
            Return path.ToString()
        Else
            Return Nothing
        End If
    End Function

    Sub Main()
        Dim s As String = GetPath(CSIDL.COMMON_PROGRAMS)
        Console.WriteLine(s)
        Console.Read()
    End Sub

End Module

引用返信 編集キー/
■48268 / inTopicNo.5)  Re[1]: スタートメニュー(All Users)のパス取得
□投稿者/ はつね (1232回)-(2010/03/31(Wed) 14:30:22)
No48264 (Maru さん) に返信
> スタートメニュー(All Users)のパスを取得するため

EnvironmentクラスのGetFolderPathメソッドでCommonApplicationDataを指定するじゃ?

引用返信 編集キー/
■48269 / inTopicNo.6)  Re[3]: スタートメニュー(All Users)のパス取得
□投稿者/ Maru (2回)-(2010/03/31(Wed) 14:32:02)
魔界の仮面弁士さんありがとうございます。

スタートメニュー(All Users)のパスを取得するのに、SHGetSpecialFolderPath を使えばよさそうなところまではたどりついたのですが
APIの使い方がまだよくわからず、VB6のサンプルを見ながら試行錯誤していました。

VB2005 向けにわざわざコードを書き直して頂きありがとうございます。

APIの使い方についてまだまだわからないことが多かったのでとても参考になります。

もっと精進させて頂きます。

本当にありがとうございました。



解決済み
引用返信 編集キー/
■48270 / inTopicNo.7)  Re[2]: スタートメニュー(All Users)のパス取得
□投稿者/ 魔界の仮面弁士 (1589回)-(2010/03/31(Wed) 14:51:17)
> ■No48264 (Maru さん) に返信
>>スタートメニュー(All Users)のパスを取得するため

だとすれば、CSIDL_COMMON_PROGRAMS ではなく、
CSIDL_COMMON_STARTMENU を選択する必要があると思います。

>> Private Const CSIDL_COMMON_PROGRAMS = 23
CSIDL_COMMON_PROGRAMS は、スタートメニューではなく「プログラム」のフォルダです。


No48268 (はつね さん) に返信
> EnvironmentクラスのGetFolderPathメソッドでCommonApplicationDataを指定するじゃ?

それだと、CSIDL_COMMON_APPDATA 相当のパスを返してしまうと思います。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -