Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.01.13;
Скачать: [xml.tar.bz2];

Вниз

DLL Strings   Найти похожие ветки 

 
Hyboid   (2003-12-25 19:12) [0]

Есть DLL"ка (lib.dll), написанная на Delphi 4.0 (если конечно номер версии имеет к.-либо значение). В ней есть функция:
function F(s:string):boolean;
Хочу ее использовать и делаю это так->

type TFunc_F = function (s:string):boolean;
...
var hDLL : Cardinal;
F : TFunc_F;
P : Pointer;
...
hDLL := LoadLibrary( "lib.dll" );
if hDLL <> 0 then begin
P := GetProcAddress( hDLL, "F" );
F := TFunc_F( P );
(***)
FreeLibrary( hDLL );
end;

В (***) идет вызов, например такой:
F("abcd");
при этом в функцию приходит только хвост строки "bcd",
а если написать так (учитывая, что тип String: s[0]==длина строки):
F(#4"abcd");
или так:
S := "abcd";
F( Chr(Length(S))+S );

то все обрабатывается правильно. Где косяк ? Ведь по сути в String"е должна передаваться длина строки.


 
Юрий Зотов   (2003-12-25 19:16) [1]

ShareMem используется?


 
Hyboid   (2003-12-25 19:26) [2]

В моей проге нет.


 
Юрий Зотов   (2003-12-25 19:34) [3]

А зря.

Когда Вы создавали DLL, то Delphi написала ДЛЯ ВАС (а не для соседа, честное слово) здоровенный комментарий. Для того чтобы Вы его ПРОЧИТАЛИ (а не проигнорировали, честное слово). И если бы Вы его-таки прочитали, то не имели бы сейчас никаких проблем.

Впрочем, еще не все потеряно - жмем F1 и читаем про ShareMem. И через 5 минут все будет работать.


 
Hyboid   (2003-12-26 19:04) [4]

DLL создавал не я. В своей проге пробовал ShareMem подключать - ниче не изменилось.


 
Hyboid   (2003-12-26 19:31) [5]

DLL создавал не я. В своей проге пробовал ShareMem подключать - ниче не изменилось.


 
Hyboid   (2003-12-26 19:33) [6]

Извиняюсь за повторное сообщение


 
Юрий Зотов   (2003-12-26 23:17) [7]

Если функция из DLL действительно такая, как Вы это показали, и автор DLL не забыл подключить к ней ShareMem, то ShareMem в EXE должен был решить проблему (при правильном подключении, конечно - в DPR и самым первым).

Если же подключение ShareMem к EXE не помогает, то, боюсь, или ShareMem не подключена к DLL, или у Вас на руках неверное описание функции.


 
Hyboid   (2003-12-27 09:43) [8]

Если ShareMem не подключена к DLL, то других вариантов, кроме как вызывать функцию
F( Chr(Length(S))+S );
нет ???


 
Юрий Зотов   (2003-12-27 10:30) [9]

Если DLL была скомпилирована с опцией {$H-}, то S в ней - это короткая строка (Паскалевская, в которой S[0] - длина). В этом случае даже и ShareMem не нужен, достаточно только изменить прототип функции:
type TFunc_F = function(S: ShortString): boolean;
и вызывать ее нормальным способом (кстати, похоже, что в Вашей DLL так и сделано, поэтому есть смысл попробовать).

Но по умолчанию опция $H включена и string - это длинная строка. Ее формат совсем другой и S[0] никакого отношения к длине не имеет. Если DLL была скомпилирована именно так, то автор, введя в нее ТАКУЮ функцию, просто ОБЯЗАН был подключить ShareMem. Если же он этого не сделал, то, боюсь, дело дрянь.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.01.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.009 c
14-37897
z.Evgen
2003-12-19 08:45
2004.01.13
Как можно разбить строку на символы?


3-37510
redd
2003-12-16 21:56
2004.01.13
Как сделать Pack таблице из делфи???


3-37576
www
2003-12-11 11:53
2004.01.13
Не заполняется DBComboBox


14-37885
AlexCo
2003-12-22 13:38
2004.01.13
Как Проиграть звук из ресурса!!!!


1-37779
alexnmsk
2003-12-26 16:23
2004.01.13
Hint в TreeView





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