Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.76/21: Рейтинг темы: голосов - 21, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 16.09.2014
Сообщений: 34

Взаимодействие ПК с внешним устройством через DLL и ошибка Lvalue required

16.09.2014, 22:05. Показов 4152. Ответов 37
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер! Пишу программу взаимодействия ПК с внешним устройством через DLL.
Инициализацию я сделал, устройство подключается нормально.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//Объявляем функцию подключения и инициализации DLL
typedef int __stdcall (*OpenDLLPlus)(const char* OpName, const char* Psw, const char* DevName, const char* Baudrate, int FlagOem);
OpenDLLPlus OpenDLLPlus1 = NULL;
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HMODULE Dll;
Dll=LoadLibrary("C:\\MyDLL.dll");
if (Dll == NULL)
{
  ShowMessage("Библиотека не найдена!");
  Application->Destroying();
}
//Подключаем ДЛЛ
OpenDLLPlus1 = (OpenDLLPlus)GetProcAddress(Dllka, "OpenDLLPlus");
OpenDLLPlus1("", "AERF", "COM3", "9600", 0);
....
Далее пытаюсь запросить дату из устройства
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
//Объявляем функцию
typedef const char* __stdcall (*GetFldStr)(const int Num, const char* Field);
GetFldStr GetFldStr1 = NULL;
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{ 
....
....
const char* Date;
//Поиск имени функции в DLL
GetFldStr1 = (GetFldStr)GetProcAddress(Dll, "GetFldStr");
//Вызывая функцию передаем число 5 - это код запроса даты, если передать 6 то получим время
Date = GetFldStr1(5, Date);
На строке Date = GetFldStr1(5, Date); вылазит ошибка [BCC32 Error] Unit1.cpp(72): E2277 Lvalue required
в оригинале эта функция на Delphi выглядит таким образом и работает нормально.
Delphi
1
2
3
4
5
6
7
8
9
Function GetFldStr(Num:Byte;Field:PChar):PChar;stdcall; far; external 'azimuth.dll' name 'GetFldStr';
 
procedure TForm2.FormShow(Sender: TObject);
var
  DataP: PChar;
begin
GetMem(DataP,255);  //Выделяем память
DataP:= GetFldStr(5, DataP);
FreeMem(DataP, 255);  //Освобождаем память
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.09.2014, 22:05
Ответы с готовыми решениями:

Ошибка Lvalue required
Выдаёт ошибку, а что это - я незнаю. Знаю что что-то там со строками связано, но я не программист) #include<iostream.h> ...

Ошибка lvalue required
#include <iostream.h> int main() { float fut,metr; cin>>fut; while(!fut=0.0); {metr=fut*0.3048; ...

Ошибка E2277 Lvalue required
Пытаюсь создать список. Вот функция, в строке: Spisok=g; выдает ошибку, помогите пожалуйста исправить. ..... struct Node { ...

37
2393 / 1913 / 763
Регистрация: 27.07.2012
Сообщений: 5,554
16.09.2014, 22:08
Что за тип:
Delphi
1
PChar
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33184 / 21482 / 8231
Регистрация: 22.10.2011
Сообщений: 36,853
Записей в блоге: 12
16.09.2014, 22:19
Цитата Сообщение от Alexey652 Посмотреть сообщение
в оригинале эта функция на Delphi выглядит таким образом и работает нормально
В оригинале под DataP выделяется память, у тебя выделения памяти под Date не видно.
0
0 / 0 / 0
Регистрация: 16.09.2014
Сообщений: 34
16.09.2014, 22:34  [ТС]
Цитата Сообщение от John Prick Посмотреть сообщение
PChar
в Delphi есть такой тип PChar указатель на символы 32 бита
А чем его заменить в C++ вроде unsigned char *

Цитата Сообщение от UI Посмотреть сообщение
В оригинале под DataP выделяется память, у тебя выделения памяти под Date не видно
Выделение памяти производится malloc(Data); ?
0
2393 / 1913 / 763
Регистрация: 27.07.2012
Сообщений: 5,554
16.09.2014, 22:42
Цитата Сообщение от Alexey652 Посмотреть сообщение
в Delphi есть такой тип PChar указатель на символы 32 бита
А чем его заменить в C++ вроде unsigned char *
Символы 32 бита или указатель 32 бита?
unsigned char * - это указатель на байт. Если на символ, то без unsigned. Размер char = 1 байт (8 бит).
0
0 / 0 / 0
Регистрация: 16.09.2014
Сообщений: 34
16.09.2014, 22:43  [ТС]
Почему-то сейчас вылазит ошибка Cannot convert 'const char * (__stdcall *)(int,const char *)' to 'const char *'
в строке Data = GetFldStr(5, Data);
убираю "Data = " остается GetFldStr(5, Data); прога запускается нормально но при трассировке она пропускается и соответственно ничего не возвращается этой функцией
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
16.09.2014, 22:48
Имхо, как минимум второй аргумент должен быть не const, иначе как писать в такую строку?!
1
2393 / 1913 / 763
Регистрация: 27.07.2012
Сообщений: 5,554
16.09.2014, 22:55
Цитата Сообщение от Alexey652 Посмотреть сообщение
но при трассировке она пропускается и соответственно ничего не возвращается этой функцией
В библиотечные функции отладчик не будет заходит. Максимум - дизассемблер.

Добавлено через 40 секунд
Цитата Сообщение от Tulosba Посмотреть сообщение
Имхо, как минимум второй аргумент должен быть не const, иначе как писать в такую строку?!
Так тут и не понятно, пишется в неё что-нибудь или нет. Кода сабжевой функции автор не привёл.
0
0 / 0 / 0
Регистрация: 16.09.2014
Сообщений: 34
16.09.2014, 22:57  [ТС]
Цитата Сообщение от Tulosba Посмотреть сообщение
Имхо, как минимум второй аргумент должен быть не const, иначе как писать в такую строку?!
Что ты имел ввиду под вторым аргументом какой из... что на что нужно поменять?
0
2393 / 1913 / 763
Регистрация: 27.07.2012
Сообщений: 5,554
16.09.2014, 23:00
Цитата Сообщение от Alexey652 Посмотреть сообщение
Почему-то сейчас вылазит ошибка Cannot convert 'const char * (__stdcall *)(int,const char *)' to 'const char *'
в строке Data = GetFldStr(5, Data);
GetFldStr - это тип указателя на функцию. В начале у тебя было GetFldStr1, и это было правильно.
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
16.09.2014, 23:00
Цитата Сообщение от John Prick Посмотреть сообщение
не понятно, пишется в неё что-нибудь или нет. Кода сабжевой функции автор не привёл.
как же?
Pascal
1
2
3
GetMem(DataP,255);  //Выделяем память
DataP:= GetFldStr(5, DataP);
FreeMem(DataP, 255);  //Освобождаем память
Выделили, значит пишем. Не читать же мусор из памяти.
1
0 / 0 / 0
Регистрация: 16.09.2014
Сообщений: 34
16.09.2014, 23:01  [ТС]
John Prick, есть пример объявления и вызова функции на Delphi
Delphi
1
Function GetFldStr(Num:Byte;Field:PChar):PChar;stdcall; far; external 'azimuth.dll' name 'GetFldStr';
и вызов
Delphi
1
DataP:= GetFldStr(5,DataP);
DataP - тип данных PChar;
Мне нужно сделать тоже но на C++
А именно объявление функции и ее вызов с возвращаемым результатом
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
16.09.2014, 23:01
Цитата Сообщение от Alexey652 Посмотреть сообщение
что на что нужно поменять?
Для начала так:
C++
1
typedef const char* __stdcall (*GetFldStr)(const int Num, char* Field);
Паскалевский исходник GetFldStr есть?
Или даже так (учитывая Byte):
C++
1
typedef const char* __stdcall (*GetFldStr)(char Num, char* Field);
1
2393 / 1913 / 763
Регистрация: 27.07.2012
Сообщений: 5,554
16.09.2014, 23:04
Alexey652, а где код самой функции GetFldStr?
Цитата Сообщение от Tulosba Посмотреть сообщение
Выделили, значит пишем. Не читать же мусор из памяти.
Да, может, оно туда "для красоты" передаётся. Не понятно ещё, если мы туда что-то пишем, зачем потом ещё этому же и присваивать результат функции.
0
0 / 0 / 0
Регистрация: 16.09.2014
Сообщений: 34
16.09.2014, 23:07  [ТС]
Цитата Сообщение от Tulosba Посмотреть сообщение
Паскалевский исходник GetFldStr есть?
К сожалению нет, но есть описание программиста, только там тое самое что я и привел на Delphi
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
16.09.2014, 23:08
Цитата Сообщение от John Prick Посмотреть сообщение
если мы туда что-то пишем, зачем потом ещё этому же и присваивать результат функции.
Предлагаю взглянуть на strcpy() для начала. Присвоение тут опционально, но сам подход такой же. Для организации цепочек вызовов например.
0
0 / 0 / 0
Регистрация: 16.09.2014
Сообщений: 34
16.09.2014, 23:11  [ТС]
Цитата Сообщение от Tulosba Посмотреть сообщение
Или даже так (учитывая Byte):
Код C++
1
typedef const char* __stdcall (*GetFldStr)(char Num, char* Field);
Попробовал
C++
1
2
3
4
5
6
typedef const char* __stdcall (*GetFldStr)(char Num, char* Field);
GetFldStr GetFldStr1 = NULL;
....
const char* Data;
GetFldStr1 = (GetFldStr)GetProcAddress(Dllka, "GetFldStr"); //Запрос даты
Data = GetFldStr1(5, Data);
[BCC32 Error] Unit1.cpp(69): E2034 Cannot convert 'const char *' to 'char *'
Full parser context
Unit1.cpp(43): parsing: void _fastcall TForm1::Button1Click(TObject *)
[BCC32 Error] Unit1.cpp(69): E2342 Type mismatch in parameter 'Field' (wanted 'char *', got 'const char *')
Full parser context
Unit1.cpp(43): parsing: void _fastcall TForm1::Button1Click(TObject *)
0
2393 / 1913 / 763
Регистрация: 27.07.2012
Сообщений: 5,554
16.09.2014, 23:11
Tulosba, ну может быть. Но это если исходить из здравого смысла, что в данном случае не факт.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
16.09.2014, 23:17
Цитата Сообщение от Alexey652 Посмотреть сообщение
E2342 Type mismatch in parameter 'Field' (wanted 'char *', got 'const char *')
Ну а тип фактического аргумента кто менять будет?
C++
1
2
char Data[100]; // для проверки 
GetFldStr1(5, Data); // Возвращаемое значение пока тоже не трогаем
Вот ещё посмотри тему на SOF:
http://stackoverflow.com/quest... i-dll-to-c
Может быть надо учесть, что PChar не 8-битный. Т.е. в зависимости от версии дельфи.
1
0 / 0 / 0
Регистрация: 16.09.2014
Сообщений: 34
16.09.2014, 23:17  [ТС]

Может это немного разъяснит ситуацию.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.09.2014, 23:17
Помогаю со студенческими работами здесь

Lvalue required почему высвечивается такая ошибка?
#include <stdio.h> #include <conio.h> #include <iostream.h> void CutLeft(int x_min,int y_min,int x_max,int y_max, const int...

Ошибка: lvalue required as left operand of assignment
b += l * b; выдает ошибку в этой строке: lvalue required as left operand of assignment

Не могу понять, где ошибка. lvalue required as left operand of assignment
Вот сам код, ошибку выдает на строчках 90-92. #include<iostream> using namespace std; class Array{ protected:

Error: lvalue required as left operand of assignment. Не могу разобраться где ошибка
#include <stdio.h> #include <stdlib.h> int main() { int n, count = 0; for (n = 111; n < 1000; ++n) if (n / 100...

Сортировка массива структур: ошибка "LValue Required"
void sortByFio() { int i,j; char temp; char temp2; char temp3; for (i = 0; i<len; i++) { for ( i = j+1; j<len; j++) { ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru