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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание записи (record) в DLL, В DLL создаю запись - получаю эксепшн. 
:(
    Опции темы
Гость_Игорь
Дата 19.1.2004, 11:40 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Привет всем!

Ситуация такая:
из основной программы вызываю функцию в DLL, которая
выделяет память для записи и заполняет ее поля - получаю
эксепшн типа "Access violated"
Код в DLL типа такого:

Код
PMyRecord : ^TMyRecord;
TMyRecord = record
 name : string;
end;


в процедуре код такой:

Код
var p : PMyRecord;
begin
 New(p);
 p^.name:= 'Hello World!' //вот здесь и падает!!! Access violated


В чем проблема ?

Заранее спасибо.

  Вверх
<Spawn>
Дата 19.1.2004, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

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



Код
uses ..., ShareMem



--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Гость_Игорь
Дата 19.1.2004, 13:40 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Спасибо.
Попробую.

А не могли бы Вы объяснить причину эксепшна
и почему надо использовать ShareMem ?

Просто не хочу тупо код использовать, а знать что делаю.
  Вверх
<Spawn>
Дата 19.1.2004, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

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



когда создаешь ДЛЛ в Дельфи, то там есть такой текст:

Код
Important note about DLL memory management: ShareMem must be the
 first unit in your library's USES clause AND your project's (select
 Project-View Source) USES clause if your DLL exports any procedures or
 functions that pass strings as parameters or function results. This
 applies to all strings passed to and from your DLL--even those that
 are nested in records and classes. ShareMem is the interface unit to
 the BORLNDMM.DLL shared memory manager, which must be deployed along
 with your DLL. To avoid using BORLNDMM.DLL, pass string information
 using PChar or ShortString parameters.



--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
<Spawn>
Дата 19.1.2004, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

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



Хотя ты не указал, что у тебя возвращает функция в ДЛЛ(или какие параметры принимает) - дело в разных менеджерах памяти.


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Unregistered
Дата 19.1.2004, 15:00 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Я не до конца расписал код.
Вообще то вот так:

Код
procedure SomeProc(var PointerToData : Pointer);
var p : PMyRecord;
begin
New(p);
p^.name:= 'Hello World!';
...
PointerToData:= p;


Надеюсь это будет работать (просто не могу щас это проверить)

Т.е., если я правильно понял, то

1. Если я использую строки, то надо включать ShareMem.
Но тогда с моим приложением придется таскать BORLNDMM.DLL

2. Чтоб не таскать за собой BORLNDMM.DLL надо просто использовать PChar
Типа p^.name:= PChar('Hello World!');

да ?

  Вверх
<Spawn>
Дата 19.1.2004, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

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



ShareMem необходимо включать, если ты передаешь строки из ДЛЛ в свою программу. Если не хочется использовать ShareMem, то используй указатели на строки типа PAnsiChar или PWideChar.


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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