Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
bytephone32
1 / 1 / 0
Регистрация: 08.08.2012
Сообщений: 21
08.08.2012, 22:42     Преобразование void* в структуру #1
Как преобразовать 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 минуту
Нашел похожую тему: [ссылки на сторонние форумы запрещены]
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.08.2012, 22:42     Преобразование void* в структуру
Посмотрите здесь:

Указатель void на структуру C++
C++ преобразование из void* в int[n]
C++ Что значит void(*f)()=(void(*)()func?
Преобразование из «void*» в «char*» C++
C++ Приведение void* к типу указателя на структуру
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
08.08.2012, 22:46     Преобразование void* в структуру #2
что такое TAIMPFileInfo, и почему хэндл должен в него преобразовываться? что у них общего?
bytephone32
1 / 1 / 0
Регистрация: 08.08.2012
Сообщений: 21
08.08.2012, 22:58  [ТС]     Преобразование void* в структуру #3
Цитата Сообщение от 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/cpp_march/cpp_048.shtml
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
08.08.2012, 23:04     Преобразование void* в структуру #4
Цитата Сообщение от bytephone32 Посмотреть сообщение
Handle - это всего лишь void* кторый хранит адресс чего-то,
и ты уверен что там в памяти лежит структура TAIMPFileInfo
если уверен то вперед
C++
1
TAIMPFileInfo * TFI=(TAIMPFileInfo*)Handle;
Но не думаю что там лежит нужная тебе структура
NickoTin
Модератор
 Аватар для NickoTin
8173 / 3477 / 233
Регистрация: 14.06.2010
Сообщений: 4,501
Записей в блоге: 9
08.08.2012, 23:12     Преобразование void* в структуру #5
bytephone32, AInfo должно быть не HANDLE, а LPVOID (хоть это и одно и тоже по значению, но смысл разный), т.к. MapViewOfFile возвращает указатель на адрес памяти по которому спроецирован фрагмент файла. Вам нужно просто привести полученный LPVOID к (TAIMPFileInfo*)
C
1
2
3
_AInfo = (TAIMPFileInfo*)MapViewOfFile(...);
...
LPWSTR Abuf = (LPWSTR)((PBYTE)_AInfo + _AInfo->StructSize); // судя из примера и определения структуры TAIMPFileInfo
bytephone32
1 / 1 / 0
Регистрация: 08.08.2012
Сообщений: 21
08.08.2012, 23:20  [ТС]     Преобразование void* в структуру #6
Цитата Сообщение от ValeryS Посмотреть сообщение
и ты уверен что там в памяти лежит структура TAIMPFileInfo
если уверен то вперед
C++
1
TAIMPFileInfo * TFI=(TAIMPFileInfo*)Handle;
Но не думаю что там лежит нужная тебе структура
Работает вроди... Ну по крйней мере битрейт и размер файла выводит правильно, остальное покачто 000000 почему - то. буду разбиратся....
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
08.08.2012, 23:26     Преобразование void* в структуру #7
я сначала не обратил внимания что у тебя проецируемый файл
прошу пардону

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


а кто заполняет этот файл?
твоя прога или стороняя?
Стороняя - AIMP. Но есть SDK и пример... правда на делфи, с половиной разобрался, остались только такие мелочи......
NickoTin
Модератор
 Аватар для NickoTin
8173 / 3477 / 233
Регистрация: 14.06.2010
Сообщений: 4,501
Записей в блоге: 9
09.08.2012, 00:32     Преобразование void* в структуру #9
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;
}
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
09.08.2012, 23:13     Преобразование void* в структуру #10
Цитата Сообщение от 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 - целое, для файле - просто индекс с таблице ядра операционной системы. тебе не удастся это к чему-то своему "приводить".
судя по тому, что ты привел, эта структура - заголовок какого-нибудь медиа-файла. тебе нужно его прочитать в память, и там уже "приводить", а не залазить в ядро. не пустют.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
09.08.2012, 23:22     Преобразование void* в структуру #11
Цитата Сообщение от novi4ok Посмотреть сообщение
заголовок какого-нибудь медиа-файла. тебе нужно его прочитать в память,
а вот это вы внимательно читали?

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

Не по теме:

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

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

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

novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
09.08.2012, 23:37     Преобразование void* в структуру #13
Цитата Сообщение от ValeryS Посмотреть сообщение
а вот это вы внимательно читали?


файл уже проецируемый в память
и еще раз читать его в память, по крайней мере глупо
разницы как файл в память попадет принципиальной нет: или прочитан "обычно", или замаплен. речь здесь не об этом. глупо важно тыкать пальчиком в неважные детали.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
09.08.2012, 23:41     Преобразование void* в структуру #14
Цитата Сообщение от SSTREGG Посмотреть сообщение
А куда его еще читать?
а он уже лежит в памяти
Цитата Сообщение от SSTREGG Посмотреть сообщение
По теме: AIMP создает в своем АП shared область размером AIMP2_RemoteClassSize,
в памяти процесса

Цитата Сообщение от SSTREGG Посмотреть сообщение
ТС'у же требовалось спроецировать эту область в своё АП,
а вот для этого и нужен
MapViewOfFile
грубо говоря память одного процесса увидеть в другом
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.08.2012, 23:43     Преобразование void* в структуру
Еще ссылки по теме:

преобразование void в char C++
Время на преобразование void* к иным указателям C++
Прочитать из файла структуру. Преобразование atoi C++

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

Или воспользуйтесь поиском по форуму:
NickoTin
09.08.2012, 23:43     Преобразование void* в структуру
  #15

Не по теме:

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

Yandex
Объявления
09.08.2012, 23:43     Преобразование void* в структуру
Ответ Создать тему
Опции темы

Текущее время: 00:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru