PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » PureBasic для Windows » Правильное описание структуры и правильная зачистка структуры


Правильное описание структуры и правильная зачистка структуры

Сообщений 1 страница 4 из 4

1

Вопрос 1

Например есть WinAPI структура

Код:
typedef struct _PRINTER_INFO_4 {
  LPTSTR pPrinterName;
  LPTSTR pServerName;
  DWORD  Attributes;
} PRINTER_INFO_4, *PPRINTER_INFO_4;

где pPrinterName - Pointer to a null-terminated string 

которая в Пурике определена как

Код:
Structure PRINTER_INFO_4
  *pPrinterName
  *pServerName
  Attributes.l
EndStructure

Правильно ли я понимаю что ClearStructure(@var, PRINTER_INFO_4) не очистит блок на который указывает *pPrinterName
и при обнулении *pPrinterName в памяти останется потеряный блок т.е. утечка памяти ?

Если я прав то сначала нужно сделать FreeMemory(var\*pPrinterName) ?

Можно ли заменить *pPrinterName на PrinterName.s или на PrinterName$ ?
Если можно то правильно ли сработает ClearStructure(@var, PRINTER_INFO_4) и удалит блок памяти в котором размещается строка?
------------------------------------------------------------------------------------------------------------------------------------------

Вопрос 2

есть WinAPI структура

Код:
typedef struct _PRINTER_NOTIFY_INFO_DATA {
  WORD  Type;
  WORD  Field;
  DWORD Reserved;
  DWORD Id;
  union {
    DWORD  adwData[2];
    struct {
      DWORD  cbBuf;
      LPVOID pBuf;
    } Data;
  } NotifyData;
} PRINTER_NOTIFY_INFO_DATA, *PPRINTER_NOTIFY_INFO_DATA; ;

Я описал ее так

Код:
Structure PRINTER_NOTIFY_INFO_DATA_PART2
	cbBuf.l ;Indicates the size, in bytes, of the buffer pointed to by pBuf.
	pBuf.l ; Pointer to a buffer that contains the field's current data.
EndStructure

Structure PRINTER_NOTIFY_INFO_DATA
  type.w      ; PRINTER_NOTIFY_TYPE / JOB_NOTIFY_TYPE
  field.w     ; Indicates the field that changed
  reserved.l  ;
  id.l      ; Indicates the job identifier if the Type member specifies JOB_NOTIFY_TYPE. If the Type member specifies PRINTER_NOTIFY_TYPE, this member is undefined
  StructureUnion
  	adwData.l[2]
  	DataExt.PRINTER_NOTIFY_INFO_DATA_PART2
  EndStructureUnion
EndStructure

Правильно ли это?
Есть ли варианты лучше?

0

2

По вопросу 2 - структура работает

Пуриковская ИДЕ правильно подсказывает поля

Программа правильно достает данные
Например

PeekS(*pPrInfoData\DataExt\pBuf))

*pPrInfoData\adwData[0]

0

3

SadStar написал(а):

которая в Пурике определена как

Можно так

Код:
Structure PRINTER_INFO_4
  pPrinterName.s
  pServerName.s
  Attributes.l
EndStructure
SadStar написал(а):

Правильно ли я понимаю что ClearStructure(@var, PRINTER_INFO_4) не очистит блок на который указывает *pPrinterName

Не очистит, потому что функция ClearStructure не знает что в нем и как правильно его очистить.

SadStar написал(а):

Правильно ли это?

pBuf это указатель и должен быть *pBuf или pBuf.i, а не pBuf.l

0

4

Пётр написал(а):

pBuf это указатель и должен быть *pBuf или pBuf.i, а не pBuf.l

LPVOID pBuf;

В 32-битной системе это одно и то же.
Я компилирую 32-битную программу.
Как это скажется при запуске программы в 64-битной системе?

При компиляции этого кода в 64-битную программу конечно будет облом в работе.

0


Вы здесь » PureBasic - форум » PureBasic для Windows » Правильное описание структуры и правильная зачистка структуры