Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработка строки в ДЛЛ, Не могу обработать 
:(
    Опции темы
Foley
Дата 29.3.2006, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фсемба Яцца
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 31.1.2006
Где: Россия, Арх.обл

Репутация: 2
Всего: 7



Как мне обработать строку в ДЛЛ? Допустим мне надо чтоб прога брала значение из эдита, обрабатывала его в ДЛЛ и возвращала в мою прогу
Например:
Код

function TextChange(StringToChange: Pchar): Pchar; stdcall;
var st: string;
begin
st:=StringToChange+' is cool! :)))!!!';
Result:=Pchar(st);
end;

Вызываю динамически, примерно так:
Код

type
   TTextChange = Function (StringToChange: Pchar): Pchar;
   TPlugDll = function (b: boolean): boolean;//эта функция ниче не делает, просто так я //проверяю является ли ДЛЛ плагином
…
var  
   hndDLLHandle: THandle;
   TextChange: TTextChange;
   plugDll: TPlugDll;
   Name_dll: pchar;
   ResStr: string;
begin
Name_dll:=Pchar(Edit2.Text);
ResStr:=edit1.Text;
try
       hndDLLHandle := loadLibrary (Name_dll);
         if hndDLLHandle <> 0 then begin
        ShowMessage('Dll Load Sucessfull!');
         @plugDll := getProcAddress ( hndDLLHandle, 'plugDll' );
        if addr ( plugDll ) <> nil then begin
              ShowMessage('Dll is Plug-in!');
              @TextChange:= GetProcAddress(hndDLLHandle,'TextChange');
              if Addr (TextChange)<>nil then
              edit1.Text:=TextChange(Pchar(ResStr));
           end else
              showMessage ( 'This Dll is no plug-in...:(' );
         end else
           showMessage ( 'DLL not found...' );
        finally
      freeLibrary ( hndDLLHandle );
     end;  
//прошу простить если что не так написал в скобках (в англицком не силен)

В принципе работает только очень криво, всегда возвращает мне «\щ| is cool! smile))!!!»

вот проектик (если кому не лень посмотрите). ДРКБ почитал, но там мало про строковые операции написано, поэтому не нашел ничего подходящего


Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  Plug_in.zip 65,03 Kb
PM MAIL ICQ   Вверх
Демо
Дата 29.3.2006, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Foley,

Возьми за правило - выделять, изменять размер, освобождать память в обдном месте. Если выделяешь в основной программе, в ней же освобождать и изменять размер. то же самое с DLL

Для обработки строк в DLL используй стандартный прием, принятый в WINAPI:

Выделяешь в основной программе память, передаешь указатель и длину(!) в DLL. В DLL обрабатываешь, не затрагивая распределение памяти. Далее в основной программе делаешь с памятью все, что угодно.


--------------------
    
PM MAIL ICQ Skype   Вверх
Foley
Дата 29.3.2006, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фсемба Яцца
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 31.1.2006
Где: Россия, Арх.обл

Репутация: 2
Всего: 7



Демо, а примерчик можешь накропать? Я так плохо понимаю... smile
PM MAIL ICQ   Вверх
Демо
Дата 30.3.2006, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Ну например:

function ProcessString(Str: PChar; LenStr: Integer): Integer; external 'test.dll'; stdcall;

Первый вариант:

Код

function Test(Str: PChar): String;
var
  LenResult: Integer;
begin
  GetMem(Str,500);
  try
    LenResult := ProcessString(Str,500);
    SetLength(Result, LenResult);
    Move(Str[0],Result[1],LenResult);
  finally
    FreeMem(Str);
  end;
end;


Второй вариант:

Код

function Test(Str: String): String;
var
  LenResult: Integer;
begin
  Str := '1234567890';
  LenResult := ProcessString(PChar(Str),Length(Str));
  SetLength(Result, LenResult);
  Result := Str;
end;



Функция в DLL:

Код

function ProcessString(Str: PChar; LenStr: Integer): Integer; stdcall;
var
  s: String;
begin
  s := String(Str);
  if s[1]='1' 
    then s :='Test1' 
    else  s :='Test2';
  if Length(s)>LenStr then SetLength(s,LenStr);
  FillChar(Str[0],LenStr,#0);
  Move(s[1],Str[0],Length(s);
end;


PS

Писал прямо здесь, могут быть опечатки.


--------------------
    
PM MAIL ICQ Skype   Вверх
Демо
Дата 30.3.2006, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Ну и третий вариант(если кроме Delphi, других языков не будет использоваться) - использовать специальные менеджеры памяти ShareMem или FastMem.


--------------------
    
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0471 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.