Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Ошибка с импортом функции из DLL


Автор: InfMag 16.6.2006, 07:02
Вот, пытаюсь научиться работать с 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 

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

Автор: Romikgy 16.6.2006, 09:24
Код

в 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  

Автор: skyboy 16.6.2006, 09:50
InfMag, а где подключение модуля ShareMem в Uses - секции? 

Автор: Демо 16.6.2006, 10:25
InfMag, 

Код

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


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

Автор: InfMag 16.6.2006, 13:45
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 дописать 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)