реклама на сайте
подробности

 
 
> API функция WriteFile
LAS9891
сообщение Aug 26 2015, 06:47
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 206
Регистрация: 18-06-15
Пользователь №: 87 194



Привет всем. Пробую написать приложение для общения с COM-портом через API функции. Есть такой код в C++ Builder 6:
CODE
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "COMport.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

HANDLE Com_Handle;




void __fastcall TForm1::ConnectBtnClick(TObject *Sender)
{
//-----------------------------------------------------------------
LPCTSTR lpFileName = "COM1";
DWORD dwDesiredAccess = GENERIC_READ|GENERIC_WRITE; // 0xС0000000
DWORD dwShareMode = NULL;
LPSECURITY_ATTRIBUTES lpSecurityAttributes = NULL;
DWORD dwCreationDistribution = OPEN_EXISTING; // 0x00000003
DWORD dwFlagsAndAttributes = NULL;
HANDLE hTemplateFile = NULL;
//-----------------------------------------------------------------


Com_Handle = CreateFile(lpFileName,
dwDesiredAccess,
dwShareMode,
lpSecurityAttributes,
dwCreationDistribution,
dwFlagsAndAttributes,
hTemplateFile);
}
//---------------------------------------------------------------------------




void __fastcall TForm1::SendBtnClick(TObject *Sender)
{

BOOL SendState ;

LPCVOID lpBuffer; // Указатель на буфер, содержащий данные, которые будут записаны в файл.
DWORD nNumberOfBytesToWrite ;//= 1;// Число байтов, которые будут записаны в файл.
LPDWORD lpNumberOfBytesWritten; // Указатель на переменную, которая получает число записанных байтов
LPOVERLAPPED lpOverlapped; // Указатель на структуру OVERLAPPED



SendState = WriteFile(Com_Handle,
lpBuffer,
nNumberOfBytesToWrite,
lpNumberOfBytesWritten,
lpOverlapped);


//CloseHandle(Com_Handle);

}
//---------------------------------------------------------------------------




void __fastcall TForm1::Button3Click(TObject *Sender)
{

}
//---------------------------------------------------------------------------


На форме расположены 3 кнопки. Кнопка ConnectBtn открывает COM-порт. А кнопкой SendBtn пробую что-нибудь отправить. Проект компилируется и запускается, но при нажатии на кнопку SendBtn возникает error вот в таком окне:
Прикрепленное изображение


Что я делаю не так в функции WriteFile? Как исправить?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Aug 26 2015, 07:48
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(LAS9891 @ Aug 26 2015, 09:47) *
Что я делаю не так в функции WriteFile? Как исправить?
Где находятся данные, которые вы пытаетесь отправить? Сколько байтов должна отправить WriteFile? Куда она должна сохранить количество отправленных байтов? Где находится ваша структура lpOverlapped?

Иными словами, указатели lpBuffer, lpNumberOfBytesWritten, lpOverlapped и переменную nNumberOfBytesToWrite вы объявили, но не проинициализировали.
Ваша программа ругаеется, что если даже вы сами не знаете, что вам нужно передать, откуда же она возьмет эту информацию? wink.gif Она не умеет отправлять "что нибудь", ей надо конкретно сказать "передай от сих до сих и доложи о выполнении сюда".


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
LAS9891
сообщение Aug 26 2015, 10:06
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 206
Регистрация: 18-06-15
Пользователь №: 87 194



Цитата(Сергей Борщ @ Aug 26 2015, 10:48) *
Где находятся данные, которые вы пытаетесь отправить? Сколько байтов должна отправить WriteFile? Куда она должна сохранить количество отправленных байтов? Где находится ваша структура lpOverlapped?

Иными словами, указатели lpBuffer, lpNumberOfBytesWritten, lpOverlapped и переменную nNumberOfBytesToWrite вы объявили, но не проинициализировали.
Ваша программа ругаеется, что если даже вы сами не знаете, что вам нужно передать, откуда же она возьмет эту информацию? wink.gif Она не умеет отправлять "что нибудь", ей надо конкретно сказать "передай от сих до сих и доложи о выполнении сюда".


Нашел наконец-то дельную статью: http://www.systo.ru/prog/pract/com_win32.html . Сижу изучаю.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 1st September 2025 - 03:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.01379 секунд с 7
ELECTRONIX ©2004-2016