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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка с импортом функции из DLL 
V
    Опции темы
InfMag
Дата 16.6.2006, 07:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


…
***


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

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



Вот, пытаюсь научиться работать с DLL. Появилась проблемка. Вот код DLLки:
Код

library lb;

uses Windows;

function msg(ms: string):boolean;
begin
  MessageBox(0, PChar(ms), 'DLL import', MB_IconInformation + MB_OK);
end;

exports msg;

begin
end.


Вот код самого импорта DLL и использование этой функции:
Код

function msg(ms: string):boolean; stdcall; external 'lb.dll';

procedure TForm1.Button1Click(Sender: TObject);
begin
  msg('Hello World!');
end;


Вот только когда вызываю: msg('Hello World!'); окошко мессагбокс вылетает, но выводит вместо "Hello World!" --> и0E вобщем какие-то три символа, причем не важно что писать вместо Hello World, они все равно вылетают, после нажатия кнопки OK появляется ошибка Access violation с определенным адресом. Не пойму в чем проблема smile 
PM   Вверх
DragonFire
Дата 16.6.2006, 08:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



У меня была такая проблема, попробуй сделать две вещи, одна из них должна помоч:
1) Самое главное, попробуй заменить тим String на ShortString или String[255] потому что в библиотеку нельзя напрямую передавать динамические массивы. А тим String, на сколько я знаю, таким и является)
2) Укажи полный пусть к библиотеке и проекте своем, вдруг поможет) 


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


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Код

в dll 
function msg(ms: PChar):boolean;    
begin    
  MessageBox(0, (ms), 'DLL import', MB_IconInformation + MB_OK);    
end;

в проекте
procedure TForm1.Button1Click(Sender: TObject);    
begin    
  msg(PChar('Hello World!'));    
end;

сделай так , и вооще не юзай в dll тип переменых string  


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

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


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


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

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



InfMag, а где подключение модуля ShareMem в Uses - секции? 
PM MAIL   Вверх
Демо
Дата 16.6.2006, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



InfMag, 

Код

function msg(ms: string):boolean;
function msg(ms: string):boolean; stdcall; external 'lb.dll';


1. Найди одно отличие в описании функции.
2. Поищи по форуму по ключевым словам ShareMem, FastSHareMEm
 


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


…
***


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

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



DLL
Код

library lb;

uses Windows;

function msg(ms: PChar):boolean;
begin
  MessageBox(0, (ms), 'DLL import', MB_IconInformation + MB_OK);
end;

exports msg;

begin
end.


Вывоз
Код

function msg(ms: PChar):boolean; stdcall; external 'dllprj/lb.dll';

//

procedure TForm1.Button1Click(Sender: TObject);
begin
  msg('Hello World!');
end;



Не пашет, выдает это окно с глюком вместо текста и потом уже ошибка: "Priveleged instruction"

Добавлено @ 13:51 
Сорри smile Трабл решен:
Код

function msg(ms: PChar):boolean; stdcall;
begin
  MessageBox(0, ms, 'DLL import', MB_IconInformation + MB_OK);
end;

Надо было в DLL после функции stdcall дописать 
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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