Просмотр полной версии : Обмен данными с 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])]);
вроде вайдчар это переменная с ртл управляемым времем жизни а такие данные не должны передваца между длл без модуля sharemem
alexteam
02.09.2010, 12:43
mira, вайдстринг можно передавать.
но, тут затык совсем в другом месте, а именно в том что в фастскрипте используется вариант.
а ну тогда строка туда передаетса как string а не как wide.
Breadfan
02.09.2010, 13:18
ребят, вы просто скажите как сделать обмен да и все - но только учитывайте что я не программист - я ж слесарь :)
я хз передавай как стринги и преобразовывай чтоли)
Breadfan
02.09.2010, 13:54
Mira: можно тупо передать массивом чисел - но это ж блин вообще бредово будет....я потому совет и прошу ваш, чтоб херней не заниматься :)
если s определена как вайдстринг и варик их поддерживает то должно прокатить... Под нет результата ты что понимаеш? Нил или строка нулевой длины
Breadfan
02.09.2010, 14:18
Там просто ошибка при вызове происходит
ну значит дело в динамичности типа вайдстринг. Библиотека может читать динамические данные как я писал в 1 посте но не может их модифицировать или создавать. По дефолту у ехе и дллки разные манагеры памяти.
Добавлено через 7 минут
кстати твой первый пример возвращает булево - статическую переменную а второй вайду - динамическую. И как тока рантайм пытаетса освободить память занятую возвращеной строкой -косяк.
Стока создана в длл и прога не знает как её удалить прально
Breadfan
02.09.2010, 21:46
не, первый пример не булево, а интеджер дает - 0\1 - просто пример,..Mira - ты ж грамотный и образованный человек - объясни как данными полноценно обмениваться...ну пожаааалуста :)
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]);
попробуй както так.. у меня фс старый какойто вайдстроки не поддерживает)))) в любом случае без изврата тут не получитса
проверить неначем
vBulletin® v3.6.11, Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot