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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.06.2014, 09:45   #11
Alexandr17
Форумчанин
 
Регистрация: 10.12.2013
Сообщений: 227
По умолчанию

Исправил
Код:
Function TestForms(textbtn1, textbtn2, textdialog, resulttextmemo:PAnsiCHar):Boolean;
begin
  Form1:= TForm1.Create(nil);
  form1.Button1.Caption:=textbtn1;
  form1.Button2.Caption:=textbtn2;
  form1.Caption:=textdialog;
  if form1.ShowModal=mrok then begin
    resulttextmemo:=PAnsiChar(form1.Memo1.Text);
    result:=true;
    form1.Free;
  end else begin
    result:=false;
    form1.Free;
  end;
end;
вот ее вызов из проэкта
Код:
procedure TForm1.Button1Click(Sender: TObject);
type tTestForms=Function(textbtn1, textbtn2, textdialog, resulttextmemo:PAnsiCHar):Boolean;
var
  TestForms:TTestForms;
  dll_instance: Thandle;
begin
  dll_instance:= LoadLibrary('ProjectDll.dll');
  @TestForms:=GetProcAddress(dll_instance, 'TestForms');
  if TestForms('OK', 'No', 'DIALOG DLL FORMS', paNSIchar(form1.Caption)) then
    Form1.Caption:=Form1.Caption+';TRUE';
  FreeLibrary(dll_instance);
end;
Но почему та форме не присваивается текст из Memo
Alexandr17 вне форума Ответить с цитированием
Старый 18.06.2014, 10:38   #12
StriderX
Форумчанин
 
Регистрация: 21.04.2014
Сообщений: 115
По умолчанию

Цитата:
Сообщение от Alexandr17 Посмотреть сообщение
...Но почему та форме не присваивается текст из Memo
1) Литералы дельфя сама кастует правильно, а String нельзя в лоб кастовать к PAnsiChar. Сначала надо сделать каст к AnsiString: PAnsiChar(AnsiString(MyString)).

2) paNSIchar(form1.Caption) - это плохой путь для обратной связи. Туда надо без кастов сразу передавать PAnsiChar (и предельную длину выделенной строки\памяти).

3) Можно подцепить в ехе и dll модуль simplesharemem (должен быть первым в списке модулей), тогда можно будет просто передавать обычный String (менеджер памяти сам будет разбираться, что где выделять\освобождать)
StriderX вне форума Ответить с цитированием
Старый 18.06.2014, 10:50   #13
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,430
По умолчанию

А вы его туда и не передаете.
Человек_Борща вне форума Ответить с цитированием
Старый 18.06.2014, 15:51   #14
Alexandr17
Форумчанин
 
Регистрация: 10.12.2013
Сообщений: 227
По умолчанию

Цитата:
Сообщение от StriderX Посмотреть сообщение
1) Литералы дельфя сама кастует правильно, а String нельзя в лоб кастовать к PAnsiChar. Сначала надо сделать каст к AnsiString: PAnsiChar(AnsiString(MyString)).

2) paNSIchar(form1.Caption) - это плохой путь для обратной связи. Туда надо без кастов сразу передавать PAnsiChar (и предельную длину выделенной строки\памяти).

3) Можно подцепить в ехе и dll модуль simplesharemem (должен быть первым в списке модулей), тогда можно будет просто передавать обычный String (менеджер памяти сам будет разбираться, что где выделять\освобождать)
А вообще этот код будет работать на компе без delphi языка

Последний раз редактировалось Alexandr17; 18.06.2014 в 15:54.
Alexandr17 вне форума Ответить с цитированием
Старый 18.06.2014, 16:03   #15
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

Цитата:
Но почему та форме не присваивается текст из Memo
чтобы результат изменения внутренней переменной (а параметры процедуры есть ничто иное как внутренние переменные) был виден снаружи, его(параметр) надо ПРАВИЛЬНО объявить.
Код:
procedure X(const s: string);
procedure X(n: integer);
???????????
P.S. "правильного" для TC ответа нет, но указано в какую сторону рыть.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 18.06.2014, 16:07   #16
Alexandr17
Форумчанин
 
Регистрация: 10.12.2013
Сообщений: 227
По умолчанию

Код:
Function TestForms(textbtn1, textbtn2, textdialog, resulttextmemo:PAnsiCHar):Boolean;
begin
  Form1:= TForm1.Create(nil);
  form1.Button1.Caption:=String(AnsiString(textbtn1));
  form1.Button2.Caption:=String(AnsiString(textbtn2));
  form1.Caption:=String(AnsiString(textdialog));
  if form1.ShowModal=mrok then begin
    resulttextmemo:=PAnsiChar(AnsiString(form1.Memo1.Text));
    result:=true;
    form1.Free;
  end else begin
    result:=false;
    form1.Free;
  end;
end;
Код:
procedure TForm1.Button1Click(Sender: TObject);
type tTestForms=Function(textbtn1, textbtn2, textdialog, resulttextmemo:PAnsiCHar):Boolean;
var
  TestForms:TTestForms;
  dll_instance: Thandle;
  pac:pansichar;
begin
  form1.Caption:='';
  dll_instance:= LoadLibrary('ProjectDll.dll');
  @TestForms:=GetProcAddress(dll_instance, 'TestForms');
  if TestForms('OK', 'No', 'DIALOG DLL FORMS', pac) then begin
    form1.Caption:=String(AnsiString(pac));
    Form1.Caption:=Form1.Caption+';TRUE';
  end;

  FreeLibrary(dll_instance);
end;
теперь форме присваивается какие то непонятные символы

Последний раз редактировалось Alexandr17; 18.06.2014 в 16:22.
Alexandr17 вне форума Ответить с цитированием
Старый 18.06.2014, 16:17   #17
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

не ... не пойдзёць
eval вне форума Ответить с цитированием
Старый 18.06.2014, 17:57   #18
StriderX
Форумчанин
 
Регистрация: 21.04.2014
Сообщений: 115
По умолчанию

Цитата:
Сообщение от Alexandr17 Посмотреть сообщение
...теперь форме присваивается какие то непонятные символы
Тут проблема из-за очень слабой теоретической базы, надо почитать и подружиться с указателями. Надо полистать про то как устроены строки в Дельфи, чтобы иметь представление: какие, когда и где команды дописывает сам компилятор.
simplesharemem в отличие от своего предшественника sharemem не требует тащить за собой никаких дополнительных библиотек.
1)
Код:
pac : pansichar
Это указатель. При старте Button1Click там лежит мусор. Указатель в dll не меняется, поэтому как он был мусором, так и остаётся - это и рисуется.

2)
Код:
resulttextmemo:=PAnsiChar(AnsiString(form1.Memo1.Text)).
Здесь просто в "местный PAnsiChar" что-то там записалось (даже не будем говорить о том, что это что-то будет убито уже на следующей строке).

3) Чтобы что-то записать по указателю на строку надо вызывать StrPCopy(PAnsiChar, MyAnsiString) в dll. Записывать в мусор нам нельзя, поэтому ехе сначала должен выделить под это безобразие память с помощью AnsiStrAlloc(MyLength). После этого уже можно отдавать указатель в dll (и следить, чтобы dll не записывала туда строку длиннее MyLength). Когда работа с указателем будет закончена (например, отработает form1.Caption:=pac) следует освободить занятую память вызвав StrDispose(pac).
StriderX вне форума Ответить с цитированием
Старый 18.06.2014, 20:50   #19
Alexandr17
Форумчанин
 
Регистрация: 10.12.2013
Сообщений: 227
По умолчанию

А если неизвестна длина строки
Alexandr17 вне форума Ответить с цитированием
Старый 18.06.2014, 21:20   #20
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

вам зачем форма в длл?
eval вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с DLL c# (Вызов Формы из DLL) updaite C# (си шарп) 16 24.10.2013 05:48
Надстройка DLL (XLL) с формой для Excel (без VBA) Louken Microsoft Office Excel 6 09.10.2012 20:04
Работа с динамически созданной формой Airou C++ Builder 1 12.07.2011 10:58
работа с C# формой из C++ dll d2s1 Общие вопросы .NET 0 14.03.2010 00:44
Проблема с дочерней формой в DLL madmech Общие вопросы Delphi 3 09.06.2009 19:21