Форум: "Основная";
Текущий архив: 2005.03.20;
Скачать: [xml.tar.bz2];
Вниз
Вызов функции из DLL: Башня кипит! Найти похожие ветки
← →
Быстрый Шу (2005-03-02 11:45) [0]Добрый день, уважаемые!
Возникла проблема:
Есть DLL, в которой есть такая вот функция:function ss:string;
В вызывающей программе есть функция вызова:
begin
ss:="2222";
end;function CallStrInOutDLLFunc(LibraryName:String; FuncName:String;InParams:String;FuncKind:Integer):String;
И есть кнопка, по нажатию которой выполняется код:
var
hwnd:integer;
TempFunc1:function(s:string):String;
TempFunc2:function:String;
TempFunc3:procedure;
TempFunc4:procedure(p:String);
begin
case FuncKind of
1:begin
//нам это неинтересно...
end;
2: begin
try
hwnd := LoadLibrary ( PChar(LibraryName) );
if hwnd <> 0 then
begin
@TempFunc2 := GetProcAddress ( hwnd, PChar(FuncName) );
if addr ( TempFunc2 ) <> nil then
begin
Result:=TempFunc2;//точка №1
end
else
begin
ShowMessage ( "Функция ""+FuncName+"" не найдена в библиотеке: "+LibraryName );
Result:="Failed";
end;
end
else
ShowMessage ( "Библиотека не найдена: "+LibraryName );
finally
FreeLibrary ( hwnd );
end;
end;
3:begin
//это тоже пропускаем...
end;
4:begin
//ну и это тоже...
end;
end;//case//
end;procedure TForm1.Button1Click(Sender: TObject);
var s:string;
begin
s:=CallStrInOutDLLFunc("MyForms.DLL","ss","",2);//точка №2
ShowMessage(s);
end;
//----------------------------
так вот, дебаггер пишет, что в точке №1 result = "2222", то есть, то что мне и надо, НО после выхода из процедуры CallStrInOutDLLFunc, в точке №2
тот же дабаггер пишет, что s = Inaccessible value
и на showmessage вылетает "Access violation по адресу бла-бла-бла"
я так понимаю, что он типа память что ли освободил и т.д. и потерял значение, но где, и как мне его не теряя вывести и получить?
← →
TUser © (2005-03-02 11:49) [1]uses ShareMem;
← →
Smithson (2005-03-02 11:50) [2]ShareMem стоит? А вообще лучше в DLL (и из нее) передавать не строки, а PChar. Идеологически правильнее.
← →
Быстрый Шу (2005-03-02 12:12) [3]Поставил ShareMem и в дллке и в вызывающем модуле, терь он на выходе из процедуры вызова CallStrInOutDLLFunc пишет:
"Invalid pointer operation"
← →
Быстрый Шу (2005-03-02 12:20) [4]На PChar менять нельзя, система, откуда потом эта функция будет вызываться этот тип не поддерживает...
← →
У (2005-03-02 12:30) [5]2Быстрый Шу (02.03.05 12:20) [4]
Это кто тебе сказал?
И если уж система PChar не поддерживает (в чём я сомневаюсь)
- то дельфёвый AnsiString она 101%-но не поддерживает.
← →
GuAV © (2005-03-02 12:33) [6]Быстрый Шу (02.03.05 12:12) [3]
и в вызывающем модуле
Не надо его ставить в вызывающем модуле !
Есо надо ставить первым в .dpr !
А вообще - см [1]
> лучше в DLL (и из нее) передавать не строки,
> а PChar. Идеологически правильнее
← →
Digitman © (2005-03-02 12:35) [7]
> и в вызывающем модуле
не в модуле нужно ставить, а в обоих dpr ! 1-й позицией в USES
← →
Digitman © (2005-03-02 12:37) [8]
> система, откуда потом эта функция будет вызываться этот
> тип не поддерживает
мало того - эта "система" знать ничего не знает ни о каких Sharemem ..
при этом толку от того что ты влупил Sharemem в свою библиотеку - как от козла молока
← →
Быстрый Шу (2005-03-02 12:56) [9]хм...система это скрипты типа фастскрипт, только первые версии от Карло Кока, переменные типа String она поддерживает, а PChar нет.
---------
поставил ShareMem в обоих DPRах, всё равно на showmessage выдаёт аксесс виолатион
---------
если проблема в шаремеме, то почему в точке №1 Result="2222"
а в переменную s при вызове ничего не пишется??
в библиотеку то он уже до присваивания Result`у он уже сходил?
и значит функция из библиотеки отработала и значение Резалту отдала, имхо не в шаремеме дело...
← →
Digitman © (2005-03-02 13:15) [10]
> система это скрипты типа фастскрипт
это не "система", это просто некий прикладной механизм
в дан.случае под "системой" следует подразумевать не иначе как среду разработки и конкретный язык, использованный для кодирования алгоритма
если речь идет о PascalScript-компоненте от Карло Кока, то очевидно что компонент этот мог быть использован тобой не иначе как в Делфи- или BCB-приложении .. т.е. "системы" одинаковы ..
> всё равно на showmessage выдаёт аксесс виолатион
потому что на этот момент константы "2222" в АП тек.процесса уже не существует
← →
DiamondShark © (2005-03-02 13:19) [11]Ха, прикольно. Нетривиальная ситуация.
Всё дело в этом:
ss:="2222";
и
FreeLibrary ( hwnd );
Т.е. возвращается константная строка (она не в динамической памяти, а в сегменте данных библиотеки!), а потом библиотека выгружается.
Решение:begin
Result:=TempFunc2;//точка №1
UniqueString(Result);
end
← →
Jay1982 © (2005-03-02 13:22) [12]Попоробуй не String, a ShortString
← →
ty (2005-03-02 13:30) [13]gh
← →
Digitman © (2005-03-02 13:43) [14]или другое решение
function ss:string;
begin
ss:=StrPas("2222");
end;
← →
Быстрый Шу (2005-03-02 13:44) [15]В первую очередь:
DiamondShark © (02.03.05 13:19) [11]
Биг сенкс, тут то она(собака по имени писец) и была зарыта,
прощёлкал я этот момент...Всё заработало.
-----------------
Далее:
Digitman © (02.03.05 13:15) [10]
> это не "система", это просто некий прикладной механизм
прикладной механизм можно тоже назвать "системой"
"системой" можно назвать всё, что угодно, а назвал я этот ПРИКЛАДНОЙ МЕХАНИЗМ системой, что бы лишней инфой, не относящейся к делу,не парить вам мозги.
------------
Всем: ShareMem оказался всё-таки ни причём.
← →
Digitman © (2005-03-02 15:04) [16]
> ShareMem оказался всё-таки ни причём
аукнется тебе еще это ..
← →
Erik1 © (2005-03-02 15:10) [17]У тебя будет не просто баг, а место где они живут и плодятся! А страна в твоей программе будет называтся Багандия-Трахандия.
← →
Digitman © (2005-03-02 15:20) [18]
> что бы лишней инфой, не относящейся к делу
нифига себе "лишней")
да это первоочерадная задача - обеспечить соглашения о типах и вызовах !
VBA - тоже "система", и там тоже есть тип String
но это отнюдь не означает, что паскалевский и васиковский String-типы - одно и тоже !
← →
Быстрый Шу (2005-03-02 17:35) [19]Ну ладно-ладно, про ShareMem я в курсе, не спорю, только для решения данной задачи он мне ни к чему.
> Digitman © (02.03.05 15:20) [18]
>
> > что бы лишней инфой, не относящейся к делу
>
>
> нифига себе "лишней")
я же сказал, что там тип PChar не поддерживается, а где он не поддерживается-это уже лишнее, хотя для личного развития если...видишь,DiamondShark проблему определил даже не зная про то, что эта функция из скрипта вызываться будет...
> Erik1 © (02.03.05 15:10) [17]
> У тебя будет не просто баг, а место где они живут и плодятся!
> А страна в твоей программе будет называтся Багандия-Трахандия.
да им там нечем питаться будет...там всего-то пара функций...
P.S.: ShareMem всё таки вставил, не люблю жуков :)
← →
Eraser © (2005-03-02 17:38) [20]а где он не поддерживается-это уже лишнее
В ядре WinCE не поддерживается и что?
← →
Digitman © (2005-03-02 17:49) [21]
> ShareMem всё таки вставил
все это смахивает на поведение героя чеховского "Хамелеона" - то вставил, то убрал, то опять засандалил)
ты уж разберись сразу и навсегда, когда шаромем нужен, а когда не нужен .. от этого и будущее твоей Баготрахоляндии зависит напрямую)
а то так и будешь париться ..
← →
Быстрый Шу (2005-03-02 18:12) [22]
> Digitman © (02.03.05 17:49) [21]
>
> ты уж разберись сразу и навсегда, когда шаромем нужен, а
> когда не нужен .. от этого и будущее твоей Баготрахоляндии
> зависит напрямую)
> а то так и будешь париться ..
да не нужен он мне, я его вставил только ради того, что бы вы мою супер-пупер-мега-гига дллку не называли "Баготрахляндией"))
← →
Eraser © (2005-03-02 18:21) [23]Быстрый Шу
Зато теперь твою DLLху нельзя будет использовать в приложениях написаных на MSVC++...
← →
Быстрый Шу (2005-03-02 18:24) [24]
> Eraser © (02.03.05 18:21) [23] >
> Зато теперь твою DLLху нельзя будет использовать в приложениях
> написаных на MSVC++...
С шаромемом или без??
← →
DiamondShark © (2005-03-02 18:32) [25]
> да не нужен он мне, я его вставил только ради того, что
> бы вы мою супер-пупер-мега-гига дллку не называли "Баготрахляндией"))
А вот тут ты сильно ошибаешься.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.03.20;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.041 c