Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.013 c
4-37993
Владислав
2003-11-11 09:28
2004.01.13
О управлении памятью в Win32.


1-37786
aser
2003-12-28 11:31
2004.01.13
Большие числа


1-37709
Kein
2003-12-25 18:11
2004.01.13
Звук


3-37568
CraKer
2003-12-14 00:03
2004.01.13
Filter не делается по значениям с пробелом...


6-37819
Vorobyev Sergey
2003-11-12 08:42
2004.01.13
Как определить рабочую группу удаленного компьютера ?