Форум: "Основная";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];
ВнизПроблема с DLL!!! Найти похожие ветки
← →
Schummi (2004-05-02 13:30) [0]Мастера, тут проблема с использованием DLL. Вот код, в чем ошибка?
код самой dll:library mardis_slm;
uses
classes,
Sysutils;
type
PStringList=^TStringList;
procedure GetSR(ps:PStringList); StdCall;
begin
ps^.Clear;
end;
exports
GetSR;
begin
end.
и код программы:type
PStringList = ^TStringList;
TDllProc = procedure(Params:PStringList);
...
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
DllProc:TDllProc;
ws0:string;
DllHandle,i:integer;
ts:pstringlist;
begin
ws0:=ExtractFileDir(ParamStr(0))+"\mardis_slm.dll";
DllHandle:=LoadLibrary(PChar(ws0));
@DllProc:=GetProcAddress(DllHandle,"GetSR");
if @DllProc<>nil then
begin
i:=-1;
New(ts);
ts^:=tstringlist.create;
ts^.Clear;
ts^.add("3");
ts^.add("19");
DllProc(ts);
i:=ts^.Count;
showmessage(InttoStr(i));
dispose(ts);
end;
end;
помогите, пожалуйста. Я сам уже все FAQ перерыл, хэлпы - ничего не нашел!!!
← →
Cobalt © (2004-05-02 13:35) [1]Мда, в чём проблема - так и неизвестно...
← →
Schummi (2004-05-02 15:20) [2]Cobalt, у тебя тоже ошибка вылетает?
← →
Palladin © (2004-05-02 15:43) [3]утечка памяти это раз, указатель на указатель это два
← →
TUser © (2004-05-02 15:45) [4]Schummi, напиши, что за огшибка и где вылетает. И StdCall убери нафиг - без него никакого AV нету.
← →
Anatoly Podgoretsky © (2004-05-02 15:50) [5]А комментарий при создании ДЛЛ читал?
← →
Palladin © (2004-05-02 15:53) [6]:) и нечитал комментарий это три
← →
Schummi (2004-05-02 19:55) [7]2Palladin где эта утечка и как её устранить? Что значит указатель не указатель?
2TUser вылетает где-то в модуле, а где, я не знаю
2Anatoly Podgoretsky хорошо, прочитаю
Но ,простите за наглость, что мне тогда в коде исправить?
← →
Телипат проснулся на мгновение (2004-05-02 20:58) [8]Компилируй dll и exe с ран-тайм библиотеками.
← →
Schummi (2004-05-02 20:59) [9]в комментарии написано только про тип string, а я же передаю в длл-ку указатель - тип pointer? какая моет быть утечка???
← →
Cobalt © (2004-05-03 10:45) [10]Дело не в утечке - ты передаешь ссылку на класс - а таблицы виртуальных методов (VMT) класса в двух прогах завсегда разный.
А так в этих самых ран-тайм библиотеках будет указан один и тот же адрес=>ссылка будет интерпретироваться как один и тот же класс, а не два разных (разные - в длл и ехе)
← →
Palladin © (2004-05-03 13:29) [11]утечка - ты не освобождаешь созданный TStringList
указатель на указатель - сам идентификатор объекта - уже указатель
это замечания, они к ошибке, про которую ты ничего не сказал, не относятся... TStringList передавать можно в принципе, но не нужно передавай TStringList.CommaText и в dll создавай объект TStringList и назначай CommaText переданное... не забудь указать ShareMem в файле проекта и файле dll... самым первым...
← →
Schummi (2004-05-03 16:48) [12]простите за ламерство - ну не знаю я, а это как
> Компилируй dll и exe с ран-тайм библиотеками.
???
← →
Schummi (2004-05-03 16:49) [13]а про CommaText надо попробовать!
← →
Schummi (2004-05-03 21:31) [14]попробовал вариант с CommaText - на этом и остановился. Но тут все проходит без ошибок только если убрать stdcall! А, кстати, для чего нужен этот элемент?
← →
Palladin © (2004-05-03 21:32) [15]а кстати в справке хорошо написано
← →
Черный прапорщик (2004-05-03 21:34) [16]procedure GetSR(ps:PStringList); export;
← →
Palladin © (2004-05-03 21:37) [17]это что за откровение? вам батенька тоже справку почитать надо
← →
Palladin © (2004-05-03 21:38) [18]Это что за откровение? Вам, батенька, тоже справку почитать надо.
← →
Черный прапорщик (2004-05-03 21:41) [19]Может перегнул и скорей всего (не вниг, каюсь), но для статического вызова помоему именно так.
← →
Palladin © (2004-05-03 21:44) [20]far, near и export не имеют смысла в win32 и оставлены для обратной совместимости
← →
Черный прапорщик (2004-05-03 21:53) [21]Поступаю проще (>far, near и export не имеют смысла в win32 и оставлены для обратной совместимости) - методом проб и ошибок, а не долгим вниканием в тексты хелпов, на предмет может - не может.
Как правило начальство не интесует свободное владение иностранных языков и время на изучение таковых, а интересует моментальная реализация их гениальных идей.
Вам всем хорошо... (Операция с новым годом)
← →
Schummi (2004-05-04 19:21) [22]2Черный прапорщик Знаешь, почитывать хелп иногда тоже полезно!!!
← →
TUser © (2004-05-04 19:57) [23][4] - точно говорю, если поставить stdcall - вылетает AV. Если убить - не вылетает.
← →
Schummi (2004-05-06 07:58) [24]TUser В этом ты прав! Я тоже с этим долго мучался! Но почему?
← →
Digitman © (2004-05-06 09:07) [25]кроме всех прочих серьезных ошибок ключевая ошибка - здесь, в строчке из текста ДЛЛ :
ps^.Clear;
связана она с тем , что в недрах метода происходит обращение к конкретному экземпляру менеджера памяти (и управляемым им структурам).. при этом обращение происходит попытка освобождения занятых элементами списка блоков пямяти, и если выделены эти блоки были иным экземпляром менеджера (например, экземпляром менеджера хост-процесса, вызывающего ДЛЛ), то вот здесь как раз и возникает критическая искл.ситуация
выходов не менее чем два (оба сводятся к использованию единого менеджера памяти)
1. Использовать ShareMem в USES вызывающего и вызываемого модулей (о чем и идет речь в комментарии в шаблоне текста нового ДЛЛ-проекта)
2. Осуществлять сборку обоих проектов (вызывающего и вызываемого) с опцией Build With Run-Time Packages = True
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.037 c