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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.07.2009, 13:15   #1
smirnoff843
Новичок
Джуниор
 
Регистрация: 03.07.2009
Сообщений: 3
Восклицание Обращение из Delphi к DLL написанной на C++

Здравствуйте! У меня вопрос по работе с типом puchar. Такая ситуация: имеется dll файл написанный на C++Builder. Из dll экспортируется функция следующим образом

Код:
extern "C" bool __declspec( dllexport ) func1(unsigned char *input, unsigned char *output);
В проекте Delphi импортируем эту функцию:

Код:
function func1(input: pointer; output: pointer): bool; cdecl;
external 'my.dll' name '_func1';
Работаем с импортированной функцией func1:

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  i :integer;
  s : string;
  a: array[0..30000] of char;
  b: ^uchar;

  a2: array[0..60000] of uchar;
  b2: ^uchar;
begin
StrCopy(a, pchar(Memo1.Text));

b := @a;
b2 := @a2;

func1(b,b2); 

for I := 0 to Length(Memo1.Text) do
s := s + chr(a2[i]);
Memo2.Text := s;
end;
Проблема в том, что func1 видит только первый (нулевой) символ массива "a", а необходимо, чтобы весь массив был доступен для dll.

Вот в dll выводится на экран параметр input
Код:
ShowMessage((char *)input);
Объясните, пожалуйста, как правильно передать указатель на uchar из Delphi в dll. Заранее огромное спасибо!
smirnoff843 вне форума Ответить с цитированием
Старый 03.07.2009, 13:30   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Объясняю: func1(@a, @a2);
не обязательно создать тип ^uchar или ^char... это дельфи
В вызовах вы все верно написали... может быть проблема вообще в коде (в библиотеки)?
BOBAH13 вне форума Ответить с цитированием
Старый 03.07.2009, 15:34   #3
smirnoff843
Новичок
Джуниор
 
Регистрация: 03.07.2009
Сообщений: 3
Лампочка

Вот для наглядности код DLL:

Код:
#include <vcl.h>
#include <windows.h>
#pragma hdrstop

#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
	return 1;
}
//---------------------------------------------------------------------------
extern "C" bool __declspec( dllexport ) func1(unsigned char *input, unsigned char *output);
extern "C" void __declspec( dllexport ) test();

bool func1(unsigned char *input, unsigned char *output)
{
ShowMessage((char *)input);
input = output;
}

void test()
{
unsigned char *input = "test";
func1(input,input);
}
Обращение из Delphi:

Код:
function func1(input: pointer; output: pointer): bool; cdecl;
external 'my.dll' name '_func1';
procedure test(); cdecl;
external 'my.dll' name '_test';

procedure TForm1.Button1Click(Sender: TObject);
var
  i :integer;
  s : string;
  a: array[0..30000] of char;
  b: ^uchar;

  a2: array[0..60000] of uchar;
  b2: ^uchar;
begin
StrCopy(a, '123456');
test();   //проверка вызова func1 внутри dll
b := @a;
b2 := @a2;
func1(@a,@a2); //вызов func1 из dll
end;
При вызове func1(@a,@a2); видим только символ "1", нужно вывести все содержимое массива.
smirnoff843 вне форума Ответить с цитированием
Старый 03.07.2009, 22:26   #4
smirnoff843
Новичок
Джуниор
 
Регистрация: 03.07.2009
Сообщений: 3
Радость

всем спасибо за участие. проблема решена. нужно было компилировать в delphi 7. (delphi 2009 неправильно передает указатель на массив)

Код:
function func1(input: pchar; output: pchar): bool;  cdecl;
external 'my.dll' name '_func1';


procedure TForm1.Button1Click(Sender: TObject);
var
  a: array[0..40] of char;
  b: pchar;
begin
  a := 'drtj2sdasdasdasd';
  b := @a;
  func1(b,b);
end;
smirnoff843 вне форума Ответить с цитированием
Старый 04.07.2009, 01:07   #5
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Delphi 2009 - Unicode compatibility т.е. char - widechar значит к примеру '1' as char = '1'#$00 думаю поняли, почему тогда если смотреть как ansichar то и получается что 1 и дальше 0, значит строка = 1 Delphi 7 - char = ansichar -> значит и все ок.
BOBAH13 вне форума Ответить с цитированием
Старый 04.07.2009, 01:27   #6
Evgeniy26
Форумчанин
 
Аватар для Evgeniy26
 
Регистрация: 29.05.2009
Сообщений: 384
По умолчанию

Цитата:
Сообщение от smirnoff843 Посмотреть сообщение
delphi 2009 неправильно передает указатель на массив
В Delphi 2009 используй PAnsiChar в место PChar. Опоздал.
Evgeniy26 вне форума Ответить с цитированием
Старый 21.03.2017, 11:13   #7
vlkc
Новичок
Джуниор
 
Регистрация: 08.04.2010
Сообщений: 2
По умолчанию

Поднимаю тему. Помогите перевести на депфи:

struct LPRResultData
{
RECT lprRect;
char lprStr[20];
float conf;
int isPassed;
};


#ifdef __cplusplus
extern "C" {
#endif

void LPR_EngineCreate(const char szDicPath);

int LPR_Process(void hEngineHandle, char filename, LPRResultData*& pPlates);

void LPR_EngineDestroy(void* hEngineHandle);

#ifdef __cplusplus
vlkc вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как использовать в Delphi-программе функции из DLL, написанной на C# АТИКОН Общие вопросы Delphi 12 19.03.2013 08:28
Обращение из формы в dll к элементу главной формы (delphi) a_n_n_a Помощь студентам 3 10.05.2009 04:00
Создать DLL на C# и вызвать её в Delphi (Delphi) RIO Общие вопросы Delphi 2 25.03.2008 15:33
Откат написанной программы фЁдОр Свободное общение 13 20.12.2007 11:35