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

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

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.09.2014, 21:15   #1
alexey6522
 
Регистрация: 27.09.2009
Сообщений: 8
По умолчанию Помогите с переводом куска кода на Delphi в C++ Builder

Всем добрый вечер! Мне нужно перевести код написанный на Delphi в С++ Builder, если есть у кого-то какие-то идеи подскажите пжл.
Код:
//Delphi

implementation

{$R *.dfm}

//Объявляем функцию подключения к библиотеке
Function OpenDLL(OpName,Psw,DevName:PChar; Baudrate: PChar; FlagOem: Integer): Integer; stdcall; far; external 'azimuth.dll' name 'OpenDLLPlus';

procedure TForm2.FormShow(Sender: TObject);
var
  Dllka: HMODULE;
  StartSeans: function(): integer;
begin
Dllka:=LoadLibrary('azimuth.dll');
If Dllka=0 then Begin
    ShowMessage('Библиотека не найдена!');
    Application.Destroy;
  end;
//Подключаем ДЛЛ
OpenDll('', 'AERF', 'COM1', '9600', 0);
StartSeans:=GetProcAddress(Dllka, 'StartSeans');
end;
alexey6522 вне форума Ответить с цитированием
Старый 09.09.2014, 11:36   #2
alexey6522
 
Регистрация: 27.09.2009
Сообщений: 8
По умолчанию

Часть уже перевел
Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HMODULE Dllka; /*хэндл*/
//StartSeans: function(): integer;
int __stdcall(*StartSeans)(void);/*указка на функцию типа int func(void)*/
Dllka=LoadLibrary("C:\\Documents and Settings\\spitsyn.aleksei.PS\\Рабочий стол\\Прим-08 DELPHI\\azimuth.dll");
if (Dllka == NULL)
{
ShowMessage("Библиотека не найдена!");
  Application->Destroying();
}
//Подключаем ДЛЛ
//OpenDll("", "AERF", "COM1", "9600", 0);
StartSeans = GetProcAddress(Dllka, "StartSeans");/*возможно потребуется приведение типа*/
}
А как быть с этой строкой?
Код:
Function OpenDLL(OpName,Psw,DevName:PChar; Baudrate: PChar; FlagOem: Integer): Integer; stdcall; far; external 'azimuth.dll' name 'OpenDLLPlus';
alexey6522 вне форума Ответить с цитированием
Старый 09.09.2014, 14:07   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

#define OpenDLL OpenDLLPlus
extern "C" int __stdcall OpenDLLPlus(const char* OpName, const char* Psw, const char* DevName, const char* Baudrate, int FlagOem);

Потом подключаем azimuth.lib

Мне не совсем понятно почему OpenDLL вызывается напрямую а StartSeans через LoadLibrary и GetProcAddress.
waleri на форуме Ответить с цитированием
Старый 09.09.2014, 17:06   #4
alexey6522
 
Регистрация: 27.09.2009
Сообщений: 8
По умолчанию

не я так придумал, а по другому не хочет работать
Попробовал эту функцию в деле
Код:
#define OpenDLL OpenDLLPlus
extern "C" int __stdcall OpenDLLPlus(const char* OpName, const char* Psw, const char* DevName, const char* Baudrate, int FlagOem);
void __fastcall TForm1::Button1Click(TObject *Sender)
{
OpenDLL("", "AERF", "COM3", "9600", 0); <--- если вызов функции закомментировать то программа запускается нормально
выдается ошибка
[ILINK32 Error] Error: Unresolved external 'OpenDLLPlus' referenced from C:\...\DEBUG\UNIT1.OBJ

можно и StartSeans вызвать напрямую
Function StartSeans: Integer; stdcall; far; external 'azimuth.dll' name 'StartSeans';

А как можно вызвать функцию OpenDLL через LoadLibrary может так проще будет

Последний раз редактировалось Stilet; 09.09.2014 в 18:04.
alexey6522 вне форума Ответить с цитированием
Старый 10.09.2014, 10:16   #5
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

alexey6522
Чтобы работало, надо сделать для DLL файл LIB с помощью implib и подключить его к проекту. Тогда линкер ругаться не будет. А проще, наверное, описать OpenDll как указатель и взять его GetProcAddress по аналогии с StartSeans.
FataLL вне форума Ответить с цитированием
Старый 10.09.2014, 17:45   #6
alexey6522
 
Регистрация: 27.09.2009
Сообщений: 8
По умолчанию

А как описать OpenDll как указатель и взять его GetProcAddress по аналогии с StartSeans?
alexey6522 вне форума Ответить с цитированием
Старый 10.09.2014, 17:56   #7
alexey6522
 
Регистрация: 27.09.2009
Сообщений: 8
По умолчанию

implib может проигнорить часть ф-ций из либы и их не будет видно в приложении, по этому проще?
alexey6522 вне форума Ответить с цитированием
Старый 15.09.2014, 15:48   #8
alexey6522
 
Регистрация: 27.09.2009
Сообщений: 8
По умолчанию

Неужели никто не знает как переделать эту функцию
Код:
Function OpenDLLPlus(OpName,Psw,DevName:PChar; Baudrate: PChar; FlagOem: Integer): Integer; stdcall; far; external 'azimuth.dll' name 'OpenDLLPlus';
что бы её вызвать не напрямую, а через LoadLibrary и GetProcAddress по аналогии с StartSeans.
Пробовал таким вот образом, не получилось
Код:
int __stdcall(*OpenDLLPlus)(const char* OpName, const char* Psw, const char* DevName, const char* Baudrate, int FlagOem);
Вызов функции выглядел так
Код:
OpenDLLPlus("", "AERF", "COM1", "9600", 0);
программа вылетала с ошибкой.
alexey6522 вне форума Ответить с цитированием
Старый 16.09.2014, 22:10   #9
alexey6522
 
Регистрация: 27.09.2009
Сообщений: 8
По умолчанию

инициализацию я сделал, устройство подключается нормально.
Код:
//Объявляем функцию подключения и инициализации 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(Dll, "OpenDLLPlus");
OpenDLLPlus1("", "AERF", "COM3", "9600", 0);
Далее пытаюсь запросить дату из устройства
Код:
//Объявляем функцию
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 выглядит таким образом и работает нормально.
Код:
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);  //Освобождаем память
Помогите разобраться пожалуйста!
alexey6522 вне форума Ответить с цитированием
Старый 17.09.2014, 00:25   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Насколько я понимаю, GetFldStr возвращает указатель, который переписывает тот указатель, который вы выделили, соответственно потом освобождаете не ту память.
waleri на форуме Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Трансляция куска кода с си на делфи Pavel_Filatov Общие вопросы Delphi 5 22.07.2014 20:05
Занимаюсь переводом кода с Си на Delphi. Вроде перевел, но осталась парочка нюансов munthrekosh Общие вопросы Delphi 7 25.12.2013 09:34
[Delphi] Сшить 3 куска кода (WinApi) SartAlfard Помощь студентам 0 17.10.2011 19:11
Разбор куска кода. Alexcomeback Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 05.04.2011 18:14
Помогите пожалуйста с переводом Delphi на C++ Jupiter Помощь студентам 0 07.07.2009 23:33