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

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

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

Re[7]: AssocQueryString(API)について


(過去ログ 108 を表示中)

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

■64114 / inTopicNo.1)  AssocQueryString(API)について
  
□投稿者/ のび〜 (1回)-(2012/11/08(Thu) 11:08:51)

分類:[.NET 全般] 

os xp vb.net2008

AssocQueryStringのサンプルコードをvb.netで探しています。

C++?かなにかのサンプルコードはあったのですがこれをvb.netにどう変えていいかがわかりません。
初心者なので、宜しくお願いします。

----dinop.com より---------


#include "shlwapi.h"
#include "atlstr.h"

#pragma comment(lib,"shlwapi.lib")

//
// 拡張子に関連付けられた実行ファイル取得
//
// pszExtensionは".txt"のようにする("txt"でも構わない)
// ".bat"を取得すると"%1"になるなど実際のコマンドとならないことがある!
//
bool GetExecutable(LPCTSTR pszExtension,CAtlString& strCommand)
{
DWORD dwOut;
HRESULT hr;
TCHAR pszFile[MAX_PATH+10];
CAtlString strExt;

strCommand = _T("");
if(pszExtension == NULL)
return false;

strExt = pszExtension;
if(strExt.Left(1) != _T("."))
strExt = _T(".") + strExt;
if(strExt.GetLength() == 1)
return false;

dwOut = MAX_PATH + 10;
hr = ::AssocQueryString(ASSOCF_NOTRUNCATE,ASSOCSTR_EXECUTABLE,strExt,_T("open"),pszFile,&dwOut);
if(FAILED(hr) || dwOut == 0)
return false;

strCommand = pszFile;

return true;
}

引用返信 編集キー/
■64115 / inTopicNo.2)  Re[1]: AssocQueryString(API)について
□投稿者/ のび〜 (2回)-(2012/11/08(Thu) 11:32:39)
2012/11/08(Thu) 11:33:41 編集(投稿者)

No64114 (のび〜 さん) に返信
> os xp vb.net2008
>
> AssocQueryStringのサンプルコードをvb.netで探しています。
>
> C++?かなにかのサンプルコードはあったのですがこれをvb.netにどう変えていいかがわかりません。
No31068の記事を参考に試しているのですが、だめです。
> 初心者なので、宜しくお願いします。
>

 
> ----dinop.com より---------
>
>
> #include "shlwapi.h"
> #include "atlstr.h"
>
> #pragma comment(lib,"shlwapi.lib")
>
> //
> // 拡張子に関連付けられた実行ファイル取得
> //
> // pszExtensionは".txt"のようにする("txt"でも構わない)
> // ".bat"を取得すると"%1"になるなど実際のコマンドとならないことがある!
> //
> bool GetExecutable(LPCTSTR pszExtension,CAtlString& strCommand)
> {
> DWORD dwOut;
> HRESULT hr;
> TCHAR pszFile[MAX_PATH+10];
> CAtlString strExt;
>
> strCommand = _T("");
> if(pszExtension == NULL)
> return false;
>
> strExt = pszExtension;
> if(strExt.Left(1) != _T("."))
> strExt = _T(".") + strExt;
> if(strExt.GetLength() == 1)
> return false;
>
> dwOut = MAX_PATH + 10;
> hr = ::AssocQueryString(ASSOCF_NOTRUNCATE,ASSOCSTR_EXECUTABLE,strExt,_T("open"),pszFile,&dwOut);
> if(FAILED(hr) || dwOut == 0)
> return false;
>
> strCommand = pszFile;
>
> return true;
> }
>
引用返信 編集キー/
■64116 / inTopicNo.3)  Re[1]: AssocQueryString(API)について
□投稿者/ ヴァン (11回)-(2012/11/08(Thu) 11:33:09)
こんにちは。

「AssocQueryString vb.net」でググってみれば結構見つかるはずなんですが...

http://bbs.wankuma.com/index.cgi?mode=al2&namber=31067&KLOG=55


No64114 (のび〜 さん) に返信
> os xp vb.net2008
>
> AssocQueryStringのサンプルコードをvb.netで探しています。
>
> C++?かなにかのサンプルコードはあったのですがこれをvb.netにどう変えていいかがわかりません。
> 初心者なので、宜しくお願いします。
>
> ----dinop.com より---------
>
>
> #include "shlwapi.h"
> #include "atlstr.h"
>
> #pragma comment(lib,"shlwapi.lib")
>
> //
> // 拡張子に関連付けられた実行ファイル取得
> //
> // pszExtensionは".txt"のようにする("txt"でも構わない)
> // ".bat"を取得すると"%1"になるなど実際のコマンドとならないことがある!
> //
> bool GetExecutable(LPCTSTR pszExtension,CAtlString& strCommand)
> {
> DWORD dwOut;
> HRESULT hr;
> TCHAR pszFile[MAX_PATH+10];
> CAtlString strExt;
>
> strCommand = _T("");
> if(pszExtension == NULL)
> return false;
>
> strExt = pszExtension;
> if(strExt.Left(1) != _T("."))
> strExt = _T(".") + strExt;
> if(strExt.GetLength() == 1)
> return false;
>
> dwOut = MAX_PATH + 10;
> hr = ::AssocQueryString(ASSOCF_NOTRUNCATE,ASSOCSTR_EXECUTABLE,strExt,_T("open"),pszFile,&dwOut);
> if(FAILED(hr) || dwOut == 0)
> return false;
>
> strCommand = pszFile;
>
> return true;
> }
>
引用返信 編集キー/
■64117 / inTopicNo.4)  Re[2]: AssocQueryString(API)について
□投稿者/ ヴァン (12回)-(2012/11/08(Thu) 11:34:57)
おっと、書き込んでいる間に...

ダメって何が?

No64115 (のび〜 さん) に返信
> No31068の記事を参考に試しているのですが、だめです。

引用返信 編集キー/
■64119 / inTopicNo.5)  Re[3]: AssocQueryString(API)について
□投稿者/ のび〜 (3回)-(2012/11/08(Thu) 11:49:03)
No64117 (ヴァン さん) に返信
> おっと、書き込んでいる間に...
>
> ダメって何が?
>
> ■No64115 (のび〜 さん) に返信
>>No31068の記事を参考に試しているのですが、だめです。
>

返信ありがとうございます。

成功すれば、実行ファイルのパスが取得できるイメージでいるのですが、そうではないのでしょうか?

ちなみにこんな感じでわからないまま、ソースを書いています。引数になにをわたしていいのかわかっていません。

ちなみにだめだったとは、試してみた結果、知識不足のためだめだっということです。申し訳ございません。


public class test

<System.Runtime.InteropServices.DllImport("Shlwapi.dll", SetLastError:=True, CharSet:=System.Runtime.InteropServices.CharSet.Auto)> _
Private Shared Function AssocQueryString(ByVal flags As AssocF, ByVal str As AssocStr, ByVal pszAssoc As String, ByVal pszExtra As String, ByVal pszOut As String, ByRef pcchOut As Integer) As Integer

End Function

Public Sub main()
Dim strOut As String = ""
Dim strExtra As String = "Open"
Dim intret As Integer

intret = AssocQueryString(test.AssocF.NoTruncate, test.AssocStr.Executable, ".txt", strExtra, strOut, 1000)

End Sub

End Class

引用返信 編集キー/
■64121 / inTopicNo.6)  Re[4]: AssocQueryString(API)について
□投稿者/ howling (54回)-(2012/11/08(Thu) 12:15:18)
のび〜さん

ちょっと調べてみました。
なんだよーMSDNあるじゃんかよーと思ったらC++でした。ごふっ。

VBとかC#で使う場合はDll参照なのでめんどくさそうですねぇ。
が、C#なら良さそうなサンプル見つけました。
まんまやりたいことやってます、多分。

http://social.msdn.microsoft.com/Forums/en-US/csharplanguage/thread/d7a075ac-3a2a-40c5-89c9-87efc7d16563/

これだと、.docを選択した場合に、それに対応した既定のexeファイルのパスが取得できるよ、というものです。
うわーめんどくせー(笑
でも、参考になりました。いつか必要になった時のために…w

VBとC#はかなり近しい存在だと思っていますので、いけるかと思うのですがいかがでしょう?
(お前それくらい翻訳したれやって話でしょうが)
引用返信 編集キー/
■64122 / inTopicNo.7)  Re[4]: AssocQueryString(API)について
□投稿者/ ヴァン (13回)-(2012/11/08(Thu) 12:40:33)
多分 strOut に返ってこないのかな?

引数の pszOut は StringBuilder に変更。
引数の pcchOut は ByRef なので変数で渡す。

Dim strOut As StringBuilder = New StringBuilder(100)
Dim strExtra As String = "Open"
Dim len As Integer = 100
AssocQueryString(AssocF.NoTruncate, AssocStr.Executable, ".txt", strExtra, strOut, len)

成功すれば pcchOut に文字数が返ってくるので、本当はそれで StringBuilder の文字数を決めるべきなんだろうけどね。

No64119 (のび〜 さん) に返信
> ■No64117 (ヴァン さん) に返信
>>おっと、書き込んでいる間に...
>>
>>ダメって何が?
>>
>>■No64115 (のび〜 さん) に返信
> >>No31068の記事を参考に試しているのですが、だめです。
>>
>
> 返信ありがとうございます。
>
> 成功すれば、実行ファイルのパスが取得できるイメージでいるのですが、そうではないのでしょうか?
>
> ちなみにこんな感じでわからないまま、ソースを書いています。引数になにをわたしていいのかわかっていません。
>
> ちなみにだめだったとは、試してみた結果、知識不足のためだめだっということです。申し訳ございません。
>
>
> public class test
>
> <System.Runtime.InteropServices.DllImport("Shlwapi.dll", SetLastError:=True, CharSet:=System.Runtime.InteropServices.CharSet.Auto)> _
> Private Shared Function AssocQueryString(ByVal flags As AssocF, ByVal str As AssocStr, ByVal pszAssoc As String, ByVal pszExtra As String, ByVal pszOut As String, ByRef pcchOut As Integer) As Integer
>
> End Function
>
> Public Sub main()
> Dim strOut As String = ""
> Dim strExtra As String = "Open"
> Dim intret As Integer
>
> intret = AssocQueryString(test.AssocF.NoTruncate, test.AssocStr.Executable, ".txt", strExtra, strOut, 1000)
>
> End Sub
>
> End Class
>
引用返信 編集キー/
■64123 / inTopicNo.8)  Re[5]: AssocQueryString(API)について
□投稿者/ howling (55回)-(2012/11/08(Thu) 12:49:43)
ヴァン さん、のび〜さん

> 成功すれば pcchOut に文字数が返ってくるので、本当はそれで StringBuilder の文字数を決めるべきなんだろうけどね。

ちょうど書いたURLのやつがやってますね。
一回文字列部分はnull指定してやって、文字列長だけ取得して、再度呼び出しているようです。(しっかりStringBuilder使ってます)
ちなみに、返ってくるもの、来ないものっていうのは、
MSDNを見て、inになっている部分とoutになっている部分で見ればわかりやすいかと。
英語なんですがね…。

http://technet.microsoft.com/en-us/library/bb773471(VS.85).aspx

inoutは、入力も必須で、かつそこに出力もしてくれますよ、というものです。
だから変数でやるんですね。文字数が決まってるならその文字数を入れて、決まってないなら取得もできるように。

引用返信 編集キー/
■64127 / inTopicNo.9)  Re[6]: AssocQueryString(API)について
□投稿者/ のび〜 (4回)-(2012/11/08(Thu) 14:02:25)
皆様、返信ありがとうございます。
とても参考になりました。

教えて頂いたurlやサンプルプログラムにすこし手を加えたらできました。
Exeのパスが取得できましたので・・・・・・。

ソースをupしますので、何かご指摘の点がありましたら宜しくお願いします。


Imports System
Imports System.Runtime.InteropServices
Imports System.Text


Public Class test

<DllImport("Shlwapi.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Private Shared Function AssocQueryString(ByVal flags As AssocF, ByVal str As AssocStr, ByVal pszAssoc As String, _
ByVal pszExtra As String, ByVal pszOut As StringBuilder, ByRef pcchOut As System.UInt32) As Integer

End Function

Public Sub main()


Dim strExtra As String = Nothing
Dim intret As Integer
Dim intpcchout As System.UInt32 = 0
Dim pszOut_L As New StringBuilder
Dim doc As String


Try

intret = AssocQueryString(test.AssocF.Verify, test.AssocStr.Executable, ".txt", strExtra, Nothing, intpcchout)

pszOut_L = New StringBuilder(CInt(intpcchout))

intret = AssocQueryString(test.AssocF.Verify, test.AssocStr.Executable, ".txt", strExtra, pszOut_L, intpcchout)


doc = pszOut_L.ToString


Catch ex As Exception
MsgBox(ex.Message)
End Try

End Sub

<Flags()> _
Private Enum AssocF As Integer
Init_NoRemapCLSID = 1
Init_ByExeName = 2
Open_ByExeName = 2
Init_DefaultToStar = 4
Init_DefaultToFolder = 8
NoUserSettings = &H10
NoTruncate = &H20
Verify = &H40
RemapRunDll = &H80
NoFixUps = &H100
IgnoreBaseClass = &H200
End Enum

Private Enum AssocStr As Integer
Command = 1
Executable
FriendlyDocName
FriendlyAppName
NoOpen
ShellNewValue
DDECommand
DDEIfExec
DDEApplication
DDETopic
End Enum

End Class

引用返信 編集キー/
■64132 / inTopicNo.10)  Re[7]: AssocQueryString(API)について
□投稿者/ howling (57回)-(2012/11/08(Thu) 15:04:08)
のび〜さん

まんまやってますね(笑
へぇ…VBの例外処理ってそういう風に書くんですね。Endを書きたくないのでVBは苦手ですがw
無事解決できたようで何よりです。
解決済みにしておきますね。
何か問題があった場合は解除してください。ではでは。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -