Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
6-1080819517
bytebutcher
2004-04-01 15:38
2004.05.23
Подскажите как использовать TIdTunnelMaster и TIdTunnelSlave?


3-1083225065
Av
2004-04-29 11:51
2004.05.23
Необх из Grida записывать в базу симв знач с сохр пробелов слева


8-1078753292
max003
2004-03-08 16:41
2004.05.23
Вытащить JPEG из файла с картинками


6-1080761966
dreams
2004-03-31 23:39
2004.05.23
Отследить загрузку файла в WebBrouser


1-1083947375
Крутыш
2004-05-07 20:29
2004.05.23
Как в memo вставить символ перевода строки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский