Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вызов API диалога настройки Com порта. [D7, WinXP]


Kolan ©   (2006-01-31 13:39:00) 

Здравствуйте,
 Хочу вызвать стандартный диалог настройки. Есть как это делать:

Как всегда не обошлось без тонкостей. Структура COMMPROP имеет перемнную длину, поэтому затруднительно сразу выделить требуемый блок памяти. Как и в случае с функцией GetCommProperties, функцию GetCommConfig придется вызывать дважды:  

  . . .
  COMMCONFIG  *cf;
  DWORD        sz;
  HANDLE       port;
 . . .
  cf=(COMMCONFIG*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(COMMCONFIG));
  cf->dwSize=sizeof(COMMCONFIG);
  GetCommConfig(port,cf,&sz);
  if(sz > sizeof(COMMCONFIG)) {
     cf=(COMMCONFIG*)HeapRealloc(GetProcessHeap(),HEAP_ZERO_MEMORY,cf,sz);
     cf->dwSize=sz;
     GetCommConfig(port,cf,&sz);
  }
  . . .
  HeapFree(GetProcessHeap(),0,cf);
  CloseHandle(port);


Проблема в том что в примере - это указатель на струкуру
COMMCONFIG *cf, а у меня эта структура является полем класса.

FCommConfig: TCommConfig;
Как быть в этом случае. Те что надо сделать
if CommConfigSize > SizeOf(АCommConfig)?


Kolan   (2006-01-31 15:03:00) [1]

OK,
Poluchilos' :)


Rouse_   (2006-01-31 14:44:00) [2]

Вот так примерно:

procedure TForm1.Button1Click(Sender: TObject);
var
 CommPort : string;
 hCommFile : THandle;
 Buffer : PCommConfig;
 size : DWORD;
begin
 CommPort := 'COM1';
 hCommFile := CreateFile(PChar(CommPort),
   GENERIC_WRITE, 0, nil, OPEN_EXISTING,
   FILE_ATTRIBUTE_NORMAL, 0);
 if hCommFile <> INVALID_HANDLE_VALUE then
 try
   GetMem(Buffer, sizeof(TCommConfig));
   try
     size := 0;
     GetCommConfig(hCommFile, Buffer^, size);
   finally
     FreeMem(Buffer, sizeof(TCommConfig));
   end;
   GetMem(Buffer, size);
   try
     GetCommConfig(hCommFile, Buffer^, size);
     Buffer^.dcb.BaudRate := 1200;
     SetCommConfig(hCommFile, Buffer^, size);
   finally
     FreeMem(Buffer, size);
   end;
 finally
   CloseHandle(hCommFile);
 end;
end;


Rouse_   (2006-01-31 14:41:00) [3]

либо работай через PCommConfig = ^TCommConfig; либо через array of TCommConfig;
во втором случае
SetLength и GetCommConfig(port, @cf[0], sz);


Наверх

Титульная страница Поиск, карта сайта Написать письмо