Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.20;
Скачать: CL | DM;

Вниз

Вызов функции из 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.037 c
3-1108641512
kivadim
2005-02-17 14:58
2005.03.20
как организовать историю добавления(изменения) записей


3-1108986324
Layner
2005-02-21 14:45
2005.03.20
Как "поймать" сообщения при выполнении запросов к MSSQL


4-1107782020
grigory
2005-02-07 16:13
2005.03.20
Что делать если окно не успевает реагировать на сообщения??


1-1109860385
SAI
2005-03-03 17:33
2005.03.20
Memo


3-1108989075
Term
2005-02-21 15:31
2005.03.20
Как открыть OLE-документ из BLOB-поля