PDA

Просмотр полной версии : Обмен данными с dll


Breadfan
01.09.2010, 21:31
Дело таково (вызов описывать лень пока - если надо то покажу):
function txt(a:widestring):integer; export;stdcall;
begin
if (a[1]='S') then begin
result:=1;
end else begin
result:=0;
end; - вот так возвращается 1\0 в зависимости от первого символа.....НО! вот так результата нет
function txt(a:widestring):widestring; export;stdcall;
begin
if (a[1]='S') then begin
result:=a+a;
end else begin
result:=a;
end;вызов ее примерно так: lib:=loadLibrary('f:\probnik10.dll');
S:=CallFunction(lib,'txt',1,[(a[j])]);

mira
02.09.2010, 12:21
вроде вайдчар это переменная с ртл управляемым времем жизни а такие данные не должны передваца между длл без модуля sharemem

alexteam
02.09.2010, 12:43
mira, вайдстринг можно передавать.
но, тут затык совсем в другом месте, а именно в том что в фастскрипте используется вариант.

mira
02.09.2010, 13:01
а ну тогда строка туда передаетса как string а не как wide.

Breadfan
02.09.2010, 13:18
ребят, вы просто скажите как сделать обмен да и все - но только учитывайте что я не программист - я ж слесарь :)

mira
02.09.2010, 13:43
я хз передавай как стринги и преобразовывай чтоли)

Breadfan
02.09.2010, 13:54
Mira: можно тупо передать массивом чисел - но это ж блин вообще бредово будет....я потому совет и прошу ваш, чтоб херней не заниматься :)

mira
02.09.2010, 14:13
если s определена как вайдстринг и варик их поддерживает то должно прокатить... Под нет результата ты что понимаеш? Нил или строка нулевой длины

Breadfan
02.09.2010, 14:18
Там просто ошибка при вызове происходит

mira
02.09.2010, 15:16
ну значит дело в динамичности типа вайдстринг. Библиотека может читать динамические данные как я писал в 1 посте но не может их модифицировать или создавать. По дефолту у ехе и дллки разные манагеры памяти.

Добавлено через 7 минут
кстати твой первый пример возвращает булево - статическую переменную а второй вайду - динамическую. И как тока рантайм пытаетса освободить память занятую возвращеной строкой -косяк.
Стока создана в длл и прога не знает как её удалить прально

Breadfan
02.09.2010, 21:46
не, первый пример не булево, а интеджер дает - 0\1 - просто пример,..Mira - ты ж грамотный и образованный человек - объясни как данными полноценно обмениваться...ну пожаааалуста :)

mira
03.09.2010, 01:21
function txt(a:widestring):widestring; export;stdcall;
begin
if (a[1]='S') then begin
result:=a+a;
end else begin
result:=a;
end;

procedure txtfree(a:widestring); export;stdcall;
begin
setlength(a,0);
end;

вызов: lib:=loadLibrary('f:\probnik10.dll');
v:variant;
s:widestring;

v:=CallFunction(lib,'txt',1,[(a[j])]);
s=v;
CallFunction(lib,'txtfree',1,v); // или так CallFunction(lib,'txtfree',1,[v]);


попробуй както так.. у меня фс старый какойто вайдстроки не поддерживает)))) в любом случае без изврата тут не получитса
проверить неначем