Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.01.2018, 16:16   #1
Gawwws
Пользователь
 
Регистрация: 18.10.2008
Сообщений: 65
По умолчанию Указатели на структуру

В библиотеке имеется ф-я:
Код:
INT32 GetSupportDeviceDescription(Int32 Index, SUPPORT_DEVICE_DESCRIPTION* Description);
в которой Description – указатель на структуру для копирования в неё описания поддерживаемого устройства. Структура выглядит так:

Код:
typedef struct
{
INT32 CaptionID;
INT32 DeviceID;
WCHAR* Description;
}
SUPPORT_DEVICE_DESCRIPTION;
CaptionID - идентификатор названия типа.
DeviceID - идентификатор типа.
Description - строка описания типа (максимальная длина строки 255 символов).

Код:
В Delphi описал так:

type Tsdd  = record
  CaptionID: integer;
	DeviceID: integer;
	Description: Array [0..255] of WideChar; //Description: PWideChar;
end;

Function GetSupportDeviceDescription(Index: integer; Description: Pointer): integer; cdecl; external 'us.dll';
использую так:

Код:
var Des: Tsdd;
      index, i: integer;
......
Index:= 5;
i:= GetSupportDeviceDescription(Index, @Des);
if i = 0 Then ShowMessage(Des.Description));
Ошибка чтения на последней строчке, а если объявить Description.Description как PWideChar, то ошмбка записи в DLL на предпоследней строчке. Что я делаю не так?
Gawwws вне форума Ответить с цитированием
Старый 23.01.2018, 01:33   #2
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,869
По умолчанию

Цитата:
Сообщение от Gawwws Посмотреть сообщение
если объявить Description.Description как PWideChar, то ошмбка записи в DLL на предпоследней строчке
А в этом варианте тоже присутствует собачка?
northener вне форума Ответить с цитированием
Старый 23.01.2018, 10:14   #3
Gawwws
Пользователь
 
Регистрация: 18.10.2008
Сообщений: 65
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
А в этом варианте тоже присутствует собачка?
Ну да, ведь SUPPORT_DEVICE_DESCRIPTION* Description - должен быть указателем!
Gawwws вне форума Ответить с цитированием
Старый 23.01.2018, 10:28   #4
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,869
По умолчанию

Но PChar (PWideChar) и так уже указатель.
northener вне форума Ответить с цитированием
Старый 23.01.2018, 10:53   #5
Gawwws
Пользователь
 
Регистрация: 18.10.2008
Сообщений: 65
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
Но PChar (PWideChar) и так уже указатель.
Но в описании сказано, что SUPPORT_DEVICE_DESCRIPTION* Description -указатель на структуру, в которой 2 переменные INT32(integer) и типизированый указатель WCHAR*(PWideChar).

Проблема, думаю, при попытке записи библиотекой данных в память указателя PWideChar, но не могу понять почему!
Gawwws вне форума Ответить с цитированием
Старый 23.01.2018, 11:13   #6
Gawwws
Пользователь
 
Регистрация: 18.10.2008
Сообщений: 65
По умолчанию

Попробовал так:

Код:
type Tsdd  = record
  CaptionID: integer;
  DeviceID: integer;
  Description: PWideChar;
end;

type Psdd  = ^Tsdd;

Function GetSupportDeviceDescription(Index: integer; Description: Psdd): integer; cdecl; external 'us.dll';

procedure TForm1.Button2Click(Sender: TObject);
var PDes: Psdd;
    index, rez: integer;
begin
for Index:= 0 to SDCountOll - 1 do begin
  new(PDes);
  rez:= GetSupportDeviceDescription(Index, PDes);
  if rez = 0 Then begin
    ShowMessage(PDes^.Description);
  end;
end;
end;
и всё равно ошибка записи в us.dll!!!
Gawwws вне форума Ответить с цитированием
Старый 23.01.2018, 11:57   #7
Filka
Форумчанин
 
Регистрация: 29.10.2015
Сообщений: 273
По умолчанию

Цитата:
Сообщение от Gawwws Посмотреть сообщение
Проблема, думаю, при попытке записи библиотекой данных в память указателя PWideChar, но не могу понять почему!
Потому что указатель не инициализирован, не?
Filka вне форума Ответить с цитированием
Старый 23.01.2018, 12:10   #8
Gawwws
Пользователь
 
Регистрация: 18.10.2008
Сообщений: 65
По умолчанию

Цитата:
Сообщение от Filka Посмотреть сообщение
Потому что указатель не инициализирован, не?
А
Код:
new(PDes);
Gawwws вне форума Ответить с цитированием
Старый 23.01.2018, 12:14   #9
Filka
Форумчанин
 
Регистрация: 29.10.2015
Сообщений: 273
По умолчанию

Код:
type
  TSupportDeviceDescription = record
    CaptionID: Integer;
    DeviceID: Integer;
    Description: PWideChar;
  end;

function GetSupportDeviceDescription(Index: Integer;
  var Description: TSupportDeviceDescription): Integer; cdecl; external 'us.dll';

procedure TForm1.Button1Click(Sender: TObject);
var
  DevDescription: TSupportDeviceDescription;
  Buffer: array[Byte] of WideChar;
begin
  DevDescription.Description := @Buffer[0];
  if GetSupportDeviceDescription(5, DevDescription) = 0 then
    ShowMessage(DevDescription.Description);
end;
Filka вне форума Ответить с цитированием
Старый 23.01.2018, 12:40   #10
Gawwws
Пользователь
 
Регистрация: 18.10.2008
Сообщений: 65
По умолчанию

Цитата:
Сообщение от Filka Посмотреть сообщение
Код:
type
  TSupportDeviceDescription = record
    CaptionID: Integer;
    DeviceID: Integer;
    Description: PWideChar;
  end;

function GetSupportDeviceDescription(Index: Integer;
  var Description: TSupportDeviceDescription): Integer; cdecl; external 'us.dll';

procedure TForm1.Button1Click(Sender: TObject);
var
  DevDescription: TSupportDeviceDescription;
  Buffer: array[Byte] of WideChar;
begin
  DevDescription.Description := @Buffer[0];
  if GetSupportDeviceDescription(5, DevDescription) = 0 then
    ShowMessage(DevDescription.Description);
end;
Спасибо огромное!!! Заработало!!!

И точно!!! Нужно же инициализировать указатель внутри структуры!!!

Код:
DevDescription.Description := @Buffer[0];
Gawwws вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Указатели - надо начальную букву в слове сделать большой используя указатели FerrariF70 Общие вопросы C/C++ 13 08.09.2017 04:28
задача используя указатели на структуру ЕВГЕНИЙ Ермакович Помощь студентам 0 04.03.2012 17:36
Описать структуру ВадикСтрах Помощь студентам 2 21.11.2010 17:57
[C] массивы, указатели, двойные указатели. Iggel Общие вопросы C/C++ 5 05.05.2009 12:39