Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Синтаксис
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 03.07.2009, 13:08
smirnoff843 smirnoff843 вне форума
Прохожий
 
Регистрация: 03.07.2009
Сообщения: 5
Репутация: 10
Восклицание Обращение из 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. Заранее огромное спасибо!
Ответить с цитированием
  #2  
Старый 03.07.2009, 13:47
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

У тебя функция в dll принимает 2 однобайтовых параметра, а ты хочешь в нее передать 2 четырехбайтовых указателя. Как ты себе это представляешь.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #3  
Старый 03.07.2009, 14:59
smirnoff843 smirnoff843 вне форума
Прохожий
 
Регистрация: 03.07.2009
Сообщения: 5
Репутация: 10
Сообщение

Цитата:
Сообщение от Aristarh Dark
У тебя функция в dll принимает 2 однобайтовых параметра, а ты хочешь в нее передать 2 четырехбайтовых указателя. Как ты себе это представляешь.

Фукция в dll принимает адреса на однобайтовые массивы. длинна их например 10 элементов, но не важно - допустим это оговорено и в delphi и в c++.

Код:
unsigned char *input
- это параметр, и он не один байт занимает. это же адрес.
Ответить с цитированием
  #4  
Старый 03.07.2009, 15:45
smirnoff843 smirnoff843 вне форума
Прохожий
 
Регистрация: 03.07.2009
Сообщения: 5
Репутация: 10
Сообщение

Вот для наглядности код 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", нужно вывести все содержимое массива.
Ответить с цитированием
  #5  
Старый 03.07.2009, 16:47
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Да, конечно, сглупил я, звездочки не заметил.
Короче вот, что не так тогда:
Код:
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(@a[0],@a2[0]); 

for I := 0 to Length(Memo1.Text) do
s := s + chr(a2[i]);
Memo2.Text := s;
end;

типа так

ЗЫЖ StrCopy еще не внушает доверия, я его не использую, к тому же не уверен что подобные операции можно применять к объектам.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #6  
Старый 03.07.2009, 18:31
smirnoff843 smirnoff843 вне форума
Прохожий
 
Регистрация: 03.07.2009
Сообщения: 5
Репутация: 10
Печаль

Цитата:
Сообщение от Aristarh Dark
Короче вот, что не так тогда:
Код:
func1(@a[0],@a2[0]); 

типа так

спасибо за ответ. но указанный Вами способ ничего не изменил. по-прежнему передается начальный символ массива "a".
Ответить с цитированием
  #7  
Старый 03.07.2009, 22:24
smirnoff843 smirnoff843 вне форума
Прохожий
 
Регистрация: 03.07.2009
Сообщения: 5
Репутация: 10
Радость

всем спасибо за участие. проблема решена. нужно было компилировать в 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;
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:48.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025