![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Здравствуйте! У меня вопрос по работе с типом 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
|
||||
|
||||
![]() У тебя функция в dll принимает 2 однобайтовых параметра, а ты хочешь в нее передать 2 четырехбайтовых указателя. Как ты себе это представляешь.
Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#3
|
|||
|
|||
![]() Цитата:
Фукция в dll принимает адреса на однобайтовые массивы. длинна их например 10 элементов, но не важно - допустим это оговорено и в delphi и в c++. Код:
unsigned char *input |
#4
|
|||
|
|||
![]() Вот для наглядности код 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
|
||||
|
||||
![]() Да, конечно, сглупил я, звездочки не заметил.
Короче вот, что не так тогда: Код:
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
|
|||
|
|||
![]() Цитата:
спасибо за ответ. но указанный Вами способ ничего не изменил. по-прежнему передается начальный символ массива "a". ![]() |
#7
|
|||
|
|||
![]() всем спасибо за участие. проблема решена. нужно было компилировать в 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; |