Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Обращение из Delphi к DLL написанной на C++

50K
03 июля 2009 года
smirnoff843
3 / / 03.07.2009
Здравствуйте! У меня вопрос по работе с типом 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);
Memo2.Text := s;
end;


Проблема в том, что func1 видит только первый (нулевой) символ массива "a", а необходимо, чтобы весь массив был доступен для dll.

Вот в dll выводится на экран параметр input
 
Код:
ShowMessage((char *)input);


Объясните, пожалуйста, как правильно передать указатель на uchar из Delphi в dll. Заранее огромное спасибо!
50K
03 июля 2009 года
smirnoff843
3 / / 03.07.2009
Вот для наглядности код 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", нужно вывести все содержимое массива.
50K
03 июля 2009 года
smirnoff843
3 / / 03.07.2009
проблема решена. нужно было компилировать в 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;
14
06 июля 2009 года
Phodopus
3.3K / / 19.06.2008
D2009 правильно передает указатель на массив. А вот char-ы у него уже другие. Надо использовать (P)AnsiChar
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог