{
char sPath[] = "C:\\AUTOEXEC.BAT";
SHFILEINFOA FInfo;
SHGetFileInfoA(sPath, 0, &FInfo, sizeof(FInfo), SHGFI_TYPENAME);
CString str(FInfo.szTypeName);
AfxMessageBox((LPCTSTR)str);
}
как вызвать API функцию на C#
...
Код:
...
но на C# не пашит, кроме того еще нужно самому определять структуру SHFILEINFOA. Получается вот такой код, но он не работает:
...
Код:
public struct SHFILEINFO
{
public long hIcon;
public long iIcon;
public long dwAttributes;
public string szDisplayName;
public string szTypeName;
}
[DllImport("shell32.dll", EntryPoint = "SHGetFileInfo")]
public static extern int SHGetFileInfoA(string pszPath, int dwFileAttributes, ref SHFILEINFO psfi, int cbFileInfo, int uFlags);
public string GetFileDescription(string sPath)
{
const int SHGFI_TYPENAME = 0x400;
SHFILEINFO FInfo = new SHFILEINFO();
SHGetFileInfoA(sPath, 0, ref FInfo, Marshal.SizeOf(FInfo)+260+80- 8, SHGFI_TYPENAME);
return FInfo.szTypeName;
}
{
public long hIcon;
public long iIcon;
public long dwAttributes;
public string szDisplayName;
public string szTypeName;
}
[DllImport("shell32.dll", EntryPoint = "SHGetFileInfo")]
public static extern int SHGetFileInfoA(string pszPath, int dwFileAttributes, ref SHFILEINFO psfi, int cbFileInfo, int uFlags);
public string GetFileDescription(string sPath)
{
const int SHGFI_TYPENAME = 0x400;
SHFILEINFO FInfo = new SHFILEINFO();
SHGetFileInfoA(sPath, 0, ref FInfo, Marshal.SizeOf(FInfo)+260+80- 8, SHGFI_TYPENAME);
return FInfo.szTypeName;
}
...
Не дает никакого результата. Я думаю, что я неправильно определил структуру SHFILEINFO. Что делать я не знаю. Думал написать ДЛЛ на С++ с этой функцией и подключить её к C# приложению, но я не знаю как это сделать(стыдно:confused: )!!! Много часов проседел в нете - нашёл код на VB.NET вот он:
Код:
Private Const MAX_PATH = 260
Private Type SHFILEINFO
hIcon As Long
iIcon As Long
dwAttributes As Long
szDisplayName As String * MAX_PATH
szTypeName As String * 80
End Type
Private Declare Function SHGetFileInfo Lib "Shell32" Alias "SHGetFileInfoA" (ByVal pszPath As Any, ByVal dwFileAttributes As Long, psfi As SHFILEINFO, ByVal cbFileInfo As Long, ByVal uFlags As Long) As Long
Function GetFileDescription(ByVal sPath As String) As String
Const SHGFI_TYPENAME = &H400
Dim FInfo As SHFILEINFO
SHGetFileInfo sPath, 0, FInfo, Len(FInfo), SHGFI_TYPENAME
GetFileDescription = Left$(FInfo.szTypeName, InStr(FInfo.szTypeName & vbNullChar, vbNullChar) - 1)
End Function
Private Sub Command1_Click()
MsgBox GetFileDescription("c:\AUTOEXEC.BAT")
End Sub
Private Type SHFILEINFO
hIcon As Long
iIcon As Long
dwAttributes As Long
szDisplayName As String * MAX_PATH
szTypeName As String * 80
End Type
Private Declare Function SHGetFileInfo Lib "Shell32" Alias "SHGetFileInfoA" (ByVal pszPath As Any, ByVal dwFileAttributes As Long, psfi As SHFILEINFO, ByVal cbFileInfo As Long, ByVal uFlags As Long) As Long
Function GetFileDescription(ByVal sPath As String) As String
Const SHGFI_TYPENAME = &H400
Dim FInfo As SHFILEINFO
SHGetFileInfo sPath, 0, FInfo, Len(FInfo), SHGFI_TYPENAME
GetFileDescription = Left$(FInfo.szTypeName, InStr(FInfo.szTypeName & vbNullChar, vbNullChar) - 1)
End Function
Private Sub Command1_Click()
MsgBox GetFileDescription("c:\AUTOEXEC.BAT")
End Sub
но этот код не помог мне в нахождении причины ошибки. Помогите, пожалуйста - очень нужно. Желательно исходник проги. Зарание огромное спасибо! Вот кое какая инфа по этой функции - [ATTACH]2695[/ATTACH]
Цитата: progNet
Короче такая проблема: Нужно вызвать API функцию SHGetFileInfoA c параметрами определяющими, что нужно найти имя типа файла(например, для @"c:\AUTOEXEC.BAT" должно вывести "Пакетный файл MS-DOS").
Проще надо быть... проще! А через API работать не очень удобно.
Код:
using System;
using System.Collections.Generic;
using System.Text;
using Shell32;
namespace ConsoleApplication1 {
class Program {
static void Main(string[] args) {
ShellClass shell = new ShellClass();
Folder folder = shell.NameSpace(@"H:\Documents and Settings\hc\Desktop\");
FolderItem item = folder.ParseName("dk.xls");
Console.WriteLine(item.Type);
Console.ReadLine();
}
}
}
using System.Collections.Generic;
using System.Text;
using Shell32;
namespace ConsoleApplication1 {
class Program {
static void Main(string[] args) {
ShellClass shell = new ShellClass();
Folder folder = shell.NameSpace(@"H:\Documents and Settings\hc\Desktop\");
FolderItem item = folder.ParseName("dk.xls");
Console.WriteLine(item.Type);
Console.ReadLine();
}
}
}
В следующий раз создавайте одну тему!
Теперь всё работает! Насчёт того что API здесь неудобно - ты прав. Я просто не знал другого решения. У меня отсюда еще вопрос - Все ли API функции можно вот так заменить использованием какой-либо библиотеки???
Если это часто используемые API, то почти наверняка существует .net или на худой конец ActiveX обертка вокруг них.
Например для OpenGL, OpenAL и прочего существует обертка Tao.