クライアントPC(Windows)で、VB6とを使用してPDFリーダー(Adobe Reader、Foxit Readerなど)を検出する方法があるかどうかを知る必要があります。NET(C#)。
ユーザーがWindowsレジストリを読み取る権限を持っていない可能性があるため、Windowsレジストリを読み取ることはできません。
ありがとうございました。
クライアントPC(Windows)で、VB6とを使用してPDFリーダー(Adobe Reader、Foxit Readerなど)を検出する方法があるかどうかを知る必要があります。NET(C#)。
ユーザーがWindowsレジストリを読み取る権限を持っていない可能性があるため、Windowsレジストリを読み取ることはできません。
ありがとうございました。
「.pdf」の拡張子を持つ一時ファイルを作成し、一時ファイルに使用FindExectuable
します。FindExecutable
拡張子だけが本当に重要ですが、正しい拡張子を持つ名前だけでなく、実際のファイルが必要であることに注意してください。
A sample based on Jerry Coffin's suggestion to use FindExecutable
(based on this article):
Private Declare Function FindExecutable Lib "shell32.dll" _
Alias "FindExecutableA" ( _
ByVal lpFile As String, _
ByVal lpDirectory As String, _
ByVal lpResult As String) As Long
Private Declare Function lstrlen Lib "kernel32.dll" _
Alias "lstrlenA" ( _
ByVal lpString As Any) As Long
' FindExecutable Constants
Private Const ERROR_FILE_NOT_FOUND = 2&
Private Const ERROR_PATH_NOT_FOUND = 3&
Private Const ERROR_BAD_FORMAT = 11&
Private Sub Command1_Click()
Dim Retval As Long, buffer As String
' init buffer
buffer = Space(256)
Retval = FindExecutable("c:\windows\media\tada.wav", "", buffer)
Select Case Retval
Case 0
Debug.Print "Not enough memory to execute this method."
Case 31
Debug.Print "No file association found."
Case ERROR_FILE_NOT_FOUND
Debug.Print "File not found."
Case ERROR_PATH_NOT_FOUND
Debug.Print "Path not found."
Case ERROR_BAD_FORMAT
Debug.Print "The associated application is not a valid Win32 executable."
Case Else
Debug.Print "Associated application: " & Left$(buffer, lstrlen(buffer))
End Select
End Sub
この VB ルーチンは、ファイル拡張子の既定の実行可能ファイルを取得します。実行可能ファイルがない場合、ユーザーは拡張機能を処理するように構成されたプログラムを持っていません。
Private Declare Function FindExecutable Lib "shell32.dll" Alias "FindExecutableA" (ByVal lpFile As String, ByVal lpDirectory As String, ByVal lpResult As String) As Long
Function GetAssociation(ByVal Path As String, ByVal FileName As String) As String
Dim Result As String
Dim x As Long
Dim lngLenBuff
lngLenBuff = 256
Result = String(lngLenBuff, vbNullChar)
x = FindExecutable(FileName, Path, Result)
GetAssociation = Left$(Result, InStr(Result, Chr$(0)) - 1) 'get string to left of the null'
End Function
VB に関する質問であることは知っていますが、C# での FindExecutable の適切な実装が見つかりました。
using System;
using System.Text;
using System.Runtime.InteropServices;
namespace PaytonByrd {
public class Win32API
{
[DllImport("shell32.dll", EntryPoint="FindExecutable")]
public static extern long FindExecutableA(
string lpFile, string lpDirectory, StringBuilder lpResult);
public static string FindExecutable(
string pv_strFilename)
{
StringBuilder objResultBuffer =
new StringBuilder(1024);
long lngResult = 0;
lngResult =
FindExecutableA(pv_strFilename,
string.Empty, objResultBuffer);
if(lngResult >= 32)
{
return objResultBuffer.ToString();
}
return string.Format(
"Error: ({0})", lngResult);
}
}}
使用例を次に示します。
using System;
using System.Diagnostics;
using System.IO;
using PaytonByrd;
namespace CSharpFindExecutableTester
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
foreach(string strFile in
Directory.GetFiles("c:\\"))
{
string strOutput =
string.Format(
"{0} - Application: {1}",
strFile,
Win32API.FindExecutable(
strFile));
Debug.WriteLine(strOutput);
}
}
}
}