Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

как вызвать API функцию на C#

35K
26 февраля 2008 года
progNet
4 / / 25.02.2008
Короче такая проблема: Нужно вызвать API функцию SHGetFileInfoA c параметрами определяющими, что нужно найти имя типа файла(например, для @"c:\AUTOEXEC.BAT" должно вывести "Пакетный файл MS-DOS"). На С++ MFC у меня всё получилось вот код этой функции(пока без параметров):
...
 
Код:
{
   char sPath[] = "C:\\AUTOEXEC.BAT";
   SHFILEINFOA FInfo;
   SHGetFileInfoA(sPath, 0, &FInfo, sizeof(FInfo), SHGFI_TYPENAME);
   CString str(FInfo.szTypeName);
   AfxMessageBox((LPCTSTR)str);
}

...
но на 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;
}

...
Не дает никакого результата. Я думаю, что я неправильно определил структуру 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

но этот код не помог мне в нахождении причины ошибки. Помогите, пожалуйста - очень нужно. Желательно исходник проги. Зарание огромное спасибо! Вот кое какая инфа по этой функции - [ATTACH]2695[/ATTACH]
5
26 февраля 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: 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();
        }
    }
}
Чтобы код работал, в референсы добавить COM библиотеку Microsoft Shell Controls And Automation.


В следующий раз создавайте одну тему!
35K
26 февраля 2008 года
progNet
4 / / 25.02.2008
Большое спасибо, hardcase, очень помог.
Теперь всё работает! Насчёт того что API здесь неудобно - ты прав. Я просто не знал другого решения. У меня отсюда еще вопрос - Все ли API функции можно вот так заменить использованием какой-либо библиотеки???
5
27 февраля 2008 года
hardcase
4.5K / / 09.08.2005
Зависит от API.
Если это часто используемые API, то почти наверняка существует .net или на худой конец ActiveX обертка вокруг них.

Например для OpenGL, OpenAL и прочего существует обертка Tao.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог