Текущий архив: 2004.01.13;
Скачать: CL | DM;
Вниз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;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.008 c