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


Автор: Andreyzpr 17.7.2007, 09:38
Я учусь делать поддержку плагинов, срисовал вот код с drkb только у меня выдает ошибку:
Acess Violation at address 00404228 in module 'Project1.exe'. Read of address 012D0A00
Скажите, где я допустил ошибку..
Вот код dll
Код

library Project2;
uses
  SysUtils,
  Classes;

{$R *.res}

function PluginName:String;
begin
PluginName:='Andrey';
end;

Exports PluginName;
end.


Код программы
Код

procedure TForm1.Button1Click(Sender: TObject);
var
PluginName: function: String;
Handle:THAndle;
begin
Handle:=LoadLibrary('F:\Project2.dll');
if Handle <> 0 then
  begin
    @PluginName:=GetProcAddress(Handle, 'PluginName');
    if @PluginName <> nil then ShowMessage(PluginName);
  end;
FreeLibrary(Handle);
end;

Когда нажимаешь на кнопку, оно сначала выводит имя посредством SHowMessage а после этого уже ошибку выкидывает

Автор: Rennigth 17.7.2007, 09:46
В uses первым модулем ShareMem добавь.

Автор: Andreyzpr 17.7.2007, 17:47
Добавил. Еще хуже. Мало того что та ошибка есть ичсе и появляеться ошибка когда закрываеш програму!

Автор: Alexeis 17.7.2007, 17:51
Andreyzpr, добавить нужно и в dpr программы и в dpr dllки.

Автор: Andreyzpr 17.7.2007, 18:09
Что значит в dpr????
А почему в drkb об этом не указали??

Автор: Alexeis 17.7.2007, 18:13
dpr - это корневой модуль проекта. 
Цитата(Andreyzpr @  17.7.2007,  18:09 Найти цитируемый пост)
А почему в drkb об этом не указали?? 

Потому что об это говорит нехилая куча текста, которая появляется всякий раз когда создаешь новый проект Dll. 

Автор: ivan219 17.7.2007, 18:27
Попробуй добавить  StdCall;
Код

function PluginName:String; StdCall;

PluginName: function: String;  StdCall;

Также если строки не длиньше 255 символов используй заместо String PChar

Автор: Andreyzpr 17.7.2007, 18:33
Alexeis, ты на сильно умном языке для меня говориш ;)

ivan219 - Спасибо ;) Просто и понятно показал!! smile ПРитом все работает ;) ПАСИБА ;)

Автор: nmn 17.7.2007, 18:49
Цитата(ivan219 @  17.7.2007,  18:27 Найти цитируемый пост)
Также если строки не длиньше 255 символов используй заместо String PChar 

интересно почему это?

Автор: Alexeis 17.7.2007, 19:05
Цитата(nmn @  17.7.2007,  18:49 Найти цитируемый пост)
интересно почему это? 

  Нет такого ограничения.

Цитата(Andreyzpr @  17.7.2007,  18:33 Найти цитируемый пост)
Alexeis, ты на сильно умном языке для меня говориш ;)

  Project->View Source.

C PChar работать просто ужас. 

Автор: ivan219 17.7.2007, 19:44
Цитата(Andreyzpr @  17.7.2007,  18:33 Найти цитируемый пост)
Alexeis, ты на сильно умном языке для меня говориш ;)

И вовсе это не так за чем обманываешь smile 
dpr это расширение файла по дефолту это Project1.

dpr фаил в DLL это тот где твой код:
Код

library Project2;

uses ShareMem;

function PluginName: String; StdCall;
begin
 Result:='Andrey';
end;

Exports
 PluginName;
begin 
end.

А dpr в EXE файле это:
Код

program Project1;

uses
  ShareMem,
  Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

Вызывается путём нажатия Ctrl+F12 - > (По дефолту это фаил)  Project1

Цитата(Alexeis @  17.7.2007,  19:05 Найти цитируемый пост)
C PChar работать просто ужас.

От части да.

Автор: MetalFan 17.7.2007, 20:47
Цитата(Alexeis @  17.7.2007,  19:05 Найти цитируемый пост)
C PChar работать просто ужас.  

Widestring? ;)

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