Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
1 / 1 / 0
Регистрация: 08.08.2012
Сообщений: 21

Преобразование void* в структуру

08.08.2012, 22:42. Показов 3531. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как преобразовать HANDLE в структуру? В C# возможно написание следующего кода:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
[DllImport("kernel32.dll")]
        public static extern IntPtr OpenFileMapping(int dwDesiredAccess, bool bInheritHandle, string lpName);
 
        [DllImport("kernel32.dll")]
        public static extern IntPtr MapViewOfFile(IntPtr hFileMappingObject, int dwDesiredAccess, int dwFileOffsetHigh, int dwFileOffsetLow, int dwNumberOfbytesToMap);
 
        [DllImport("kernel32.dll")]
        public static extern int UnmapViewOfFile(IntPtr lpBaseAddress);
 
        [DllImport("kernel32.dll")]
        public static extern int CloseHandle(IntPtr hObject);
   
        public void Button1Click(System.Object Sender, System.EventArgs _e1)
        {
            IntPtr AFile;
            IntPtr AInfo;
            TAIMP2FileInfo _AInfo = new TAIMP2FileInfo();     //TAIMP2FileInfo   
            string S;
            string ABuf;
            ListBox1.Items.Clear();
            AFile = OpenFileMapping(4, true, AIMP_SDK.Units.Units.AIMP2_RemoteClass);
            AInfo = MapViewOfFile(AFile, 4, 0, 0, AIMP_SDK.Units.Units.AIMP2_RemoteFileSize);
            _AInfo = (TAIMP2FileInfo)Marshal.PtrToStructure(AInfo, typeof(TAIMP2FileInfo));
            try {
                if ((object)AInfo != null)
                {
                    unsafe
                    {
                        AInfo = new IntPtr(AInfo.ToInt32() + _AInfo.cbSizeOf);
                        ABuf = Marshal.PtrToStringUni(AInfo);
                        ListBox1.Items.Add(String.Format("{0:d} Hz, {1:d} kbps, {2:d} chans", _AInfo.nSampleRate, _AInfo.nBitRate, _AInfo.nChannels));
                        ListBox1.Items.Add(String.Format("{0:d} seconds, {1:d} bytes", _AInfo.nDuration / 1000, _AInfo.nFileSize));
                        // Read Album
                        S = ABuf.Substring(0, _AInfo.nAlbumLen);
                        ListBox1.Items.Add(String.Format("Album: {0}", S ));
                        ABuf = ABuf.Substring(_AInfo.nAlbumLen);
                        //// Read Artist
                        S = ABuf.Substring(0, _AInfo.nArtistLen);
                        ListBox1.Items.Add(String.Format("Artist: {0}", S));
                        ABuf = ABuf.Substring(_AInfo.nArtistLen);
                        //// Read Date info
                        S = ABuf.Substring(0, _AInfo.nDateLen);
                        ListBox1.Items.Add(String.Format("Date: {0}", S ));
                        ABuf = ABuf.Substring(_AInfo.nDateLen);
                        //// Read FileName
                        S = ABuf.Substring(0, _AInfo.nFileNameLen);
                        ListBox1.Items.Add(String.Format("FileName: {0}", S ));
                        ABuf = ABuf.Substring(_AInfo.nFileNameLen);
                        //// Read Genre
                        S = ABuf.Substring(0, _AInfo.nGenreLen);
                        ListBox1.Items.Add(String.Format("Genre: {0}", S));
                        ABuf = ABuf.Substring(_AInfo.nGenreLen);
                        //// Read Title
                        S = ABuf.Substring(0, _AInfo.nTitleLen);
                        ListBox1.Items.Add(String.Format("Title: {0}", S ));
                    }
                }
            } finally {
                UnmapViewOfFile(AInfo);
                CloseHandle(AFile);
            }
        }
Интересеут именно
C#
1
_AInfo = (TAIMP2FileInfo)Marshal.PtrToStructure(AInfo, typeof(TAIMP2FileInfo));
Как это возможно написать на С++?
C++
1
2
3
4
5
6
7
8
9
10
HANDLE AFile;
        HANDLE AInfo;
        TAIMPFileInfo *_AInfo;
 
        string S;
        string ABuf;
        AFile = OpenFileMappingA(FILE_MAP_READ, TRUE, AIMPRemoteAccessClass);
        AInfo = MapViewOfFile(AFile, FILE_MAP_READ, 0, 0, AIMPRemoteAccessMapFileSize);
        _AInfo = (TAIMPFileInfo *)&AInfo;
        cout<<(*(TAIMPFileInfo*) AInfo).Artist;
пробовал так не получается...

Добавлено через 1 минуту
Нашел похожую тему: [ссылки на сторонние форумы запрещены]
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.08.2012, 22:42
Ответы с готовыми решениями:

Преобразование указателя void к указателю на структуру
Здравствуйте! Можете объяснить эти строки в программе? int cmp(const void* p1, const void* p2) { return...

Указатель void на структуру
Есть некий тип структуры action. Для функции _beginthread третьим параметром требуется указатель на void. Как преобразовать структуру в...

Приведение void* к типу указателя на структуру
Тема обсуждалась здесь, но решения так и нет нормального Есть два (и более, хоть до 20) линейных списков и функция обхода списка В...

14
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
08.08.2012, 22:46
что такое TAIMPFileInfo, и почему хэндл должен в него преобразовываться? что у них общего?
0
1 / 1 / 0
Регистрация: 08.08.2012
Сообщений: 21
08.08.2012, 22:58  [ТС]
Цитата Сообщение от novi4ok Посмотреть сообщение
что такое TAIMPFileInfo, и почему хэндл должен в него преобразовываться? что у них общего?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
struct TAIMPFileInfo
{
    DWORD StructSize;
    //
    BOOL  Active;
    DWORD BitRate;
    DWORD Channels;
    DWORD Duration;
    INT64 FileSize;
    DWORD Rating;
    DWORD SampleRate;
    DWORD TrackNumber;
    //
    DWORD AlbumLength;
    DWORD ArtistLength;
    DWORD DateLength;
    DWORD FileNameLength;
    DWORD GenreLength;
    DWORD TitleLength;
    //
    PWCHAR Album;
    PWCHAR Artist;
    PWCHAR Date;
    PWCHAR FileName;
    PWCHAR Genre;
    PWCHAR Title;
};
Handle - это всего лишь void* кторый хранит адресс чего-то, и его тип еще нужно к чему то приводить.
Сдесь немного подробнее об этом написано: http://citforum.ru/programming... _048.shtml
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,863
08.08.2012, 23:04
Цитата Сообщение от bytephone32 Посмотреть сообщение
Handle - это всего лишь void* кторый хранит адресс чего-то,
и ты уверен что там в памяти лежит структура TAIMPFileInfo
если уверен то вперед
C++
1
TAIMPFileInfo * TFI=(TAIMPFileInfo*)Handle;
Но не думаю что там лежит нужная тебе структура
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
08.08.2012, 23:12
bytephone32, AInfo должно быть не HANDLE, а LPVOID (хоть это и одно и тоже по значению, но смысл разный), т.к. MapViewOfFile возвращает указатель на адрес памяти по которому спроецирован фрагмент файла. Вам нужно просто привести полученный LPVOID к (TAIMPFileInfo*)
C
1
2
3
_AInfo = (TAIMPFileInfo*)MapViewOfFile(...);
...
LPWSTR Abuf = (LPWSTR)((PBYTE)_AInfo + _AInfo->StructSize); // судя из примера и определения структуры TAIMPFileInfo
0
1 / 1 / 0
Регистрация: 08.08.2012
Сообщений: 21
08.08.2012, 23:20  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
и ты уверен что там в памяти лежит структура TAIMPFileInfo
если уверен то вперед
C++
1
TAIMPFileInfo * TFI=(TAIMPFileInfo*)Handle;
Но не думаю что там лежит нужная тебе структура
Работает вроди... Ну по крйней мере битрейт и размер файла выводит правильно, остальное покачто 000000 почему - то. буду разбиратся....
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,863
08.08.2012, 23:26
я сначала не обратил внимания что у тебя проецируемый файл
прошу пардону

Цитата Сообщение от bytephone32 Посмотреть сообщение
Ну по крйней мере битрейт и размер файла выводит правильно, остальное покачто 000000 почему - то. буду разбиратся....
а кто заполняет этот файл?
твоя прога или стороняя?
0
1 / 1 / 0
Регистрация: 08.08.2012
Сообщений: 21
08.08.2012, 23:32  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
я сначала не обратил внимания что у тебя проецируемый файл
прошу пардону


а кто заполняет этот файл?
твоя прога или стороняя?
Стороняя - AIMP. Но есть SDK и пример... правда на делфи, с половиной разобрался, остались только такие мелочи......
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
09.08.2012, 00:32
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <Windows.h>
#include <stdio.h>
 
#define AIMP2_RemoteClass L"AIMP2_RemoteInfo"
#define AIMP2_RemoteClassSize 2048
 
#pragma pack(push, 1)
typedef struct _AIMP2FileInfo
{
    DWORD cbSizeOf;
    //
    BOOL nActive;
    DWORD nBitRate;
    DWORD nChannels;
    DWORD nDuration;
    INT64 nFileSize;
    DWORD nRating;
    DWORD nSampleRate;
    DWORD nTrackID;
    //
    DWORD nAlbumLen;
    DWORD nArtistLen;
    DWORD nDateLen;
    DWORD nFileNameLen;
    DWORD nGenreLen;
    DWORD nTitleLen;
    //
    PWCHAR sAlbum;
    PWCHAR sArtist;
    PWCHAR sDate;
    PWCHAR sFileName;
    PWCHAR sGenre;
    PWCHAR sTitle;
} AIMP2FileInfo, *PAIMP2FileInfo;
#pragma pack(pop)
 
int __cdecl
wmain()
{
    HANDLE          hAIMP;
    PAIMP2FileInfo  aimpFileInfo;
    LPWSTR          pBuff;
 
    hAIMP = OpenFileMapping(FILE_MAP_READ, FALSE, AIMP2_RemoteClass);
 
    if ( !hAIMP )
    {
        wprintf(L"error %d\r\n", GetLastError());
        return 1;
    }
 
    aimpFileInfo = (PAIMP2FileInfo)MapViewOfFile(hAIMP, FILE_MAP_READ, 0, 0, AIMP2_RemoteClassSize);
 
    if ( aimpFileInfo )
    {
        WCHAR buff[256];
 
#define WRITE_TO_BUFF(x) \
    memcpy(buff, pBuff, (x) * 2); \
    buff[x] = '\0'; \
    pBuff += (x);
    
        // В pBuff вся остальная информация, разбивайте её испольуя поля nAlbumLen (и т.п.)
        // из структуры aimpFileInfo
        pBuff = (LPWSTR)((PBYTE)aimpFileInfo + aimpFileInfo->cbSizeOf);
 
        wprintf(L"%d Hz, %d kbps, %d chans\r\n", aimpFileInfo->nSampleRate, aimpFileInfo->nBitRate, aimpFileInfo->nChannels);
        wprintf(L"%d seconds, %d bytes\r\n", aimpFileInfo->nDuration / 1000, aimpFileInfo->nFileSize);
 
        WRITE_TO_BUFF(aimpFileInfo->nAlbumLen)
        wprintf(L"Album: %s\r\n", buff);
        WRITE_TO_BUFF(aimpFileInfo->nArtistLen)
        wprintf(L"Artist: %s\r\n", buff);
        WRITE_TO_BUFF(aimpFileInfo->nDateLen)
        wprintf(L"Date: %s\r\n", buff);
        WRITE_TO_BUFF(aimpFileInfo->nFileNameLen)
        wprintf(L"File name: %s\r\n", buff);
        WRITE_TO_BUFF(aimpFileInfo->nGenreLen)
        wprintf(L"Genre: %s\r\n", buff);
        WRITE_TO_BUFF(aimpFileInfo->nTitleLen)
        wprintf(L"Title: %s\r\n", buff);
        
        UnmapViewOfFile(aimpFileInfo);
    }
 
    CloseHandle(hAIMP);
    system("pause");
    return 0;
}
1
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
09.08.2012, 23:13
Цитата Сообщение от bytephone32 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
struct TAIMPFileInfo
{
    DWORD StructSize;
    //
    BOOL  Active;
    DWORD BitRate;
    DWORD Channels;
    DWORD Duration;
    INT64 FileSize;
    DWORD Rating;
    DWORD SampleRate;
    DWORD TrackNumber;
    //
    DWORD AlbumLength;
    DWORD ArtistLength;
    DWORD DateLength;
    DWORD FileNameLength;
    DWORD GenreLength;
    DWORD TitleLength;
    //
    PWCHAR Album;
    PWCHAR Artist;
    PWCHAR Date;
    PWCHAR FileName;
    PWCHAR Genre;
    PWCHAR Title;
};
Handle - это всего лишь void* кторый хранит адресс чего-то,
не так. в общем случае handle - целое, для файле - просто индекс с таблице ядра операционной системы. тебе не удастся это к чему-то своему "приводить".
судя по тому, что ты привел, эта структура - заголовок какого-нибудь медиа-файла. тебе нужно его прочитать в память, и там уже "приводить", а не залазить в ядро. не пустют.
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,863
09.08.2012, 23:22
Цитата Сообщение от novi4ok Посмотреть сообщение
заголовок какого-нибудь медиа-файла. тебе нужно его прочитать в память,
а вот это вы внимательно читали?

Цитата Сообщение от bytephone32 Посмотреть сообщение
AInfo = MapViewOfFile(AFile, FILE_MAP_READ, 0, 0, AIMPRemoteAccessMapFileSize);
файл уже проецируемый в память
и еще раз читать его в память, по крайней мере глупо
0
09.08.2012, 23:30

Не по теме:

У меня складывается ощущение что в разделе C++ сначала отвечают, а потом читают тему...

Цитата Сообщение от ValeryS Посмотреть сообщение
и еще раз читать его в память, по крайней мере глупо
А куда его еще читать? Это так отступление...

По теме: AIMP создает в своем АП shared область размером AIMP2_RemoteClassSize, ТС'у же требовалось спроецировать эту область в своё АП, и потом с этой областью работать, никакие файлы ни ТС ни AIMP не создают...

0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
09.08.2012, 23:37
Цитата Сообщение от ValeryS Посмотреть сообщение
а вот это вы внимательно читали?


файл уже проецируемый в память
и еще раз читать его в память, по крайней мере глупо
разницы как файл в память попадет принципиальной нет: или прочитан "обычно", или замаплен. речь здесь не об этом. глупо важно тыкать пальчиком в неважные детали.
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,863
09.08.2012, 23:41
Цитата Сообщение от SSTREGG Посмотреть сообщение
А куда его еще читать?
а он уже лежит в памяти
Цитата Сообщение от SSTREGG Посмотреть сообщение
По теме: AIMP создает в своем АП shared область размером AIMP2_RemoteClassSize,
в памяти процесса

Цитата Сообщение от SSTREGG Посмотреть сообщение
ТС'у же требовалось спроецировать эту область в своё АП,
а вот для этого и нужен
MapViewOfFile
грубо говоря память одного процесса увидеть в другом
0
09.08.2012, 23:43

Не по теме:

ValeryS, и что? я как бы и до Вашего поста это знал...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.08.2012, 23:43
Помогаю со студенческими работами здесь

преобразование из void* в int[n]
Всем привет) Пишу программу, которая в отдельном потоке сортирует массив. такая проблема, на функцию ...

преобразование void в char
помогите пожалуйста компилятор ругается и не хочет запускать прогу на исполнение(( невозможно преобразовать &quot;void *&quot; в...

Преобразование из «void*» в «char*»
Имеется такая строка buffer = malloc(600); Перемменая buffer у меня указатель на буффер типа Char char *buffer Ругается компилятор...

Преобразование void в double
Пример кода: glutDisplayFunc(RenderScene); // функция которая принимает в виде аргумента void функцию. На эту строчку кода VS и...

Время на преобразование void* к иным указателям
Здравствуйте. Имеется небольшой вопрос. Тратится ли время на преобразование из void* к иным типам? Насколько я понимаю не должно,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru