|
Вопрос # 2 567/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
Помогите разобраться с ошибкой в программе.
Создаю библиотеку:
library TestDLL;
uses SysUtils, Classes;
function Test: String; export;
begin
Result:='Это Тест'
end;
exports Test;
begin end.
В оснавной программе пишу:
Type
TProc = function: String;
procedure TForm1.Button1Click(Sender: TObject);
var Lib: Integer; S: String; P: TProc;
begin
Lib:=LoadLibrary('TestDLL.dll'); if Lib=0 then halt;
@PI:=GetProcAddress(Lib,'Init'); if @PI=nil then Halt;
S:=P;
Caption:=S;
end;
При выполнении возникает ошибка, хотя свойство Caption изменяется на правильное значение.
 |
Вопрос задал: Light007 (статус: Посетитель)
Вопрос отправлен: 26 марта 2009, 18:00
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: min@y™
Я не использую ShareMem и передаю в/из DLL PChar. Никаких проблем.
library TestDLL;
uses
SysUtils, Classes;
procedure Test(var S: PChar); stdcall; export;
begin
S:= PChar('Это Тест');
end;
exports
Test;
begin
end.
// В оснавной программе пишу:
Type
TProc = procedure (var S: PChar); stdcall;
procedure TForm1.Button1Click(Sender: TObject);
var
Lib: Integer;
S: String;
P: TProc;
begin
Lib:= LoadLibrary('TestDLL.dll');
if Lib = HINSTANCE_ERROR
then halt;
PI:= GetProcAddress(Lib, 'Test');
if not Assigned(P)
then Halt;
SetLength(S, 1024);
Test(PChar(S));
Caption:= S;
end;
Ахтунг! Этот кусок не отлаживал. Писал на коленке и по памяти — могут быть ошибки.
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 26 марта 2009, 20:53
Оценка за ответ: 5
|
Мини-форум вопроса
Всего сообщений: 2; последнее сообщение — 26 марта 2009, 19:13; участников в обсуждении: 2.
|
Вадим К (статус: Академик), 26 марта 2009, 18:05 [#1]:
Логично. Сколько раз писать, что передавать string с/в библиотеки плохая практика. как минимум надо подключать Sharemem.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Light007 (статус: Посетитель), 26 марта 2009, 19:13 [#2]:
string отличается от pchar 4 байтами, пробовал и pChar совместно с ShareMem - ошибка остается
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|