Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.052 c
3-1109005439
Bogdan
2005-02-21 20:03
2005.03.20
Поиск записи по нескольким знакам


1-1109677618
Kolokoltsov
2005-03-01 14:46
2005.03.20
ToolBar


4-1107353213
Eraser
2005-02-02 17:06
2005.03.20
Форма VCL и многопоточность...


3-1108641732
Shizuku
2005-02-17 15:02
2005.03.20
Report for iBx


14-1109767969
snake_r
2005-03-02 15:52
2005.03.20
BSClient





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский