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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обмен строками, DLL <-> основное приложение 
:(
    Опции темы
Coder
Дата 19.10.2006, 07:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: 5
Всего: 11



DLL:
Код

library nill_sms;

uses
  SysUtils,
  windows;

{$R *.res}

var
  s : Pchar;

procedure Getmessage(var buf : PChar); stdcall; // ??
begin
  s:=StrNew('La La La');
  buf:=s;
end;

exports
  Getmessage;

begin

end.



Приложение:
Код

var
  Form1: TForm1;
  InS : PChar;

procedure Getmessage(var pp : PChar); stdcall; external 'nill_sms.dll';

implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
begin
  GetMem(InS,100);
  FillChar(InS^,100,#0);

  Getmessage(InS);

  Caption:=(InS);
end;


так вот работает через раз - то выведет в заголовок Ла Ла Ла, то выскочит с ошибкой об обращении не в ту память. Вроде память выделяю... в чем проблема?
PM MAIL   Вверх
Matematik
Дата 19.10.2006, 07:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Coder @  19.10.2006,  08:32 Найти цитируемый пост)
Вроде память выделяю... в чем проблема? 

у dll и exe разные менеджеры памяти
PM MAIL WWW ICQ   Вверх
vlgr
Дата 19.10.2006, 07:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 27.9.2006

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



Попробуй
Код

library nill_sms;

uses
  SysUtils,
  windows;

{$R *.res}

var
  s : Pchar;

procedure Getmessage(var buf : PChar); stdcall; // ??
begin
  s:=StrNew('La La La');
  StrCopy(buf,s);
  StrDispose(s);
end;

exports
  Getmessage;

begin

end.



Или еще проще
Код

library nill_sms;

uses
  SysUtils,
  windows;

{$R *.res}

procedure Getmessage(var buf : PChar); stdcall; // ??
begin
  StrCopy(buf,'La La La');
end;

exports
  Getmessage;

begin

end.



PM MAIL   Вверх
skyboy
Дата 19.10.2006, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 4
Всего: 260



 в разделе uses для проекта прилжения(файл с расширением dpr) и проекта dll первым в списке должен стоять ShareMem.

Это сообщение отредактировал(а) skyboy - 19.10.2006, 09:50
PM MAIL   Вверх
Yanis
Дата 19.10.2006, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Цитата(skyboy @  19.10.2006,  10:47 Найти цитируемый пост)
в разделе uses для проекта прилжения(файл с расширением dpr) и проекта dll первым в списке должен стоять ShareMem

Зачем?


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
aktuba
Дата 19.10.2006, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


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

Репутация: 16
Всего: 38



Используй FastShareMem и забудь про PChar, используй string.

DLL:

Код

library nill_sms;
uses
  FastShareMem,
  SysUtils,
  windows;

{$R *.res}

procedure Getmessage(var buf : string); stdcall;
begin
  buf := 'La La La';
end;

exports
  Getmessage;

begin
end.


Приложение:

Код

uses
  FastShareMem, ...

...

type
  Form1 = class(TForm)
...

var
  Form1: TForm1;

procedure Getmessage(var pp : string); stdcall; external 'nill_sms.dll';

implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
var
  str: string;
begin
  str := '';
  Getmessage(str);
  Caption:=str;
end;


или так:

DLL:

Код

library nill_sms;
uses
  FastShareMem,
  SysUtils,
  windows;

{$R *.res}

function Getmessage: string; stdcall;
begin
  Result := 'La La La';
end;

exports
  Getmessage;

begin
end.


Приложение:

Код

uses
  FastShareMem, ...

...

type
  Form1 = class(TForm)
...

var
  Form1: TForm1;

function Getmessage: string; stdcall; external 'nill_sms.dll';

implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
var
  str: string;
begin
  str := Getmessage;
  Caption := str;
end;


По-моему, так проще...


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

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

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

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

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


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

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


 




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


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

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