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

Вниз

Передача строк в/из ДЛЛ.   Найти похожие ветки 

 
Fredericco   (2003-01-04 15:09) [0]

Есть моя ДЛЛька шифрования.
Вот код:


procedure EnCrypt_2(CodeT:PChar;var Res:PChar);// export;
var
Crypt,Code:string;
i,KeyCrypt1,KeyCrypt2,KeyCrypt3,KeyCrypt4,KeyCrypt5,KeyCrypt6,KeyCrypt7,KeyCrypt8,KeyCrypt255,KeyCrypt255_2,iCrypt:integer;
lne:integer;
begin
if @Res = nil then exit;
if CodeT = nil then exit;
try
Code:=CodeT;
Crypt:=StringOfChar(" ",Length(Code)*11);
lne:=Length(Code);
Randomize;
for i:=1 to lne do begin
KeyCrypt1:=Random(20)+1;
KeyCrypt2:=KeyCrypt1+Random(18)+1;
KeyCrypt3:=KeyCrypt2+Random(16)+1;
KeyCrypt4:=KeyCrypt3+Random(14)+1;
KeyCrypt5:=KeyCrypt4+Random(12)+1;
KeyCrypt6:=KeyCrypt5+Random(10)+1;
KeyCrypt7:=KeyCrypt6+Random(8)+1;
KeyCrypt8:=KeyCrypt7+Random(6)+1;
iCrypt:=Ord(Code[i]);
iCrypt:=(iCrypt+1) xor KeyCrypt1;
iCrypt:=(iCrypt+2) xor KeyCrypt2;
iCrypt:=(iCrypt+3) xor KeyCrypt3;
iCrypt:=(iCrypt+4) xor KeyCrypt4;
iCrypt:=(iCrypt+5) xor KeyCrypt5;
iCrypt:=(iCrypt+6) xor KeyCrypt6;
iCrypt:=(iCrypt+7) xor KeyCrypt7;
iCrypt:=(iCrypt+8) xor KeyCrypt8;
iCrypt:=iCrypt+1;
if iCrypt>255 then begin
KeyCrypt255:=iCrypt-255+1;
iCrypt:=255;
end Else KeyCrypt255:=1;
if KeyCrypt255>255 then begin
KeyCrypt255_2:=KeyCrypt255-255+1;
KeyCrypt255:=255;
end Else KeyCrypt255_2:=1;
Crypt[(i-1)*11+1]:=Chr(KeyCrypt1);
Crypt[(i-1)*11+2]:=Chr(KeyCrypt2);
Crypt[(i-1)*11+3]:=Chr(KeyCrypt3);
Crypt[(i-1)*11+4]:=Chr(KeyCrypt4);
Crypt[(i-1)*11+5]:=Chr(KeyCrypt5);
Crypt[(i-1)*11+6]:=Chr(KeyCrypt6);
Crypt[(i-1)*11+7]:=Chr(KeyCrypt7);
Crypt[(i-1)*11+8]:=Chr(KeyCrypt8);
Crypt[(i-1)*11+9]:=Chr(KeyCrypt255);
Crypt[(i-1)*11+10]:=Chr(KeyCrypt255_2);
Crypt[(i-1)*11+11]:=Chr(iCrypt);
end;
// ShowMessage(IntToStr(Length(Crypt)));
Res:=PChar(Crypt);
// ShowMessage(IntToStr(Length(Res)));
except
ShowMessage("err except");
end;
end;



Так вот при шифровани символа "A" длина строки b (проверяю в программе, вызывающей ДЛЛ: так как проверка в ДЛЛ не показала ошибок) равна 11. Пока правильно. Если пытаюсь зашифровать "AA" возвращается 21! Не правильно. Далее приведу сколько символов шифрую и длину b:
3 - 33 - правильно;
4 - 44 - правильно;
5 - 53 - не правильно;
6 - 66 - правильно;
7 - 77 - правильно;
300 - 3300 - правильно;
776 - 8536 - правильно;
777 - 8546 - не правильно;
900 - 8422 - не правильно;
9000 - 322 - не правильно;
9320 - 2 - не правильно;
9327 - 1 - не правильно;
9328 - акцесс виолятион!

Подскажите пожалуйста кто чем может.

Заранее благодарен,
с уважением
Fredericco.


 
Fredericco   (2003-01-04 15:13) [1]

Модераторы плиз не удаляйте мой пост из "Система".
Я случай туда и сюда пост отправил.
Правда не хотел!


 
Fredericco   (2003-01-08 14:26) [2]

Нашел ответ на Королевстве Дельфи.
Надо вручную выделять память под передающуюся строку, вот таким способом:

function ReturnString(StringIn: Pchar): Pchar ;
{ Puts a string on the windows heap and returns a windows handle to the string }
var
hGlobalMemory: THandle;
lpGlobalMemory: pointer ;
begin
lpGlobalMemory:=nil;
{This line sets up a character pointer from windows heap }
hGlobalMemory := GlobalAlloc(GMEM_MOVEABLE , strlen(StringIn)+1);
if hGlobalMemory <> 0 then { memory allocated OK }
begin
{ This sets up the string in the memory grabbed from the heap }
lpGlobalMemory := GlobalLock(hGlobalMemory);
lstrcpy(lpGlobalMemory,StringIn);
GlobalUnlock(hGlobalMemory);
end;
{ This returns a pointer to the string to APW }
ReturnString := Pchar(lpGlobalMemory);
end;


Но у меня снова возникла проблема, в функции разшифрования мен необшодимо возвращать не PChar, а вот такую структуру :

TComm=record
Comm:PChar;
IsCrypt:Bool;
end;

TCommands2=array of TComm;


Под переменную Comm каждого элемента массива я память выделяю вышеописанным способом. А под всю структуру, которую я передаю обратно в ехе : Commands:TCommands2; не знаю как память выделить, не поможите, плииз.

С уважением
Fredericco.


 
REA   (2003-01-09 13:20) [3]

Память DLL и EXE общая, поэтому имхо не суть важно как ее выделить (главное не выделять локально в функции). Со строкой нужно ее длину передавать иначе как узнать ее размер? (там 0 могут быть).


 
Verg   (2003-01-09 13:59) [4]


> Память DLL и EXE общая, поэтому имхо не суть важно как ее
> выделить (главное не выделять локально в функции)


Память-то общая, а диспетчеры Heap разные. Таким образом, если функция в DLL выделит память каким-либо дельфозным способом (GetMem, new, setlength...), то вызывающий эту функцию модуль освободить эту память корректно не сможет.
Ситуация правится тремя способами:

1. Проект компилируется с опцией Build with runtim packages.

2. { Important note about DLL memory management: ShareMem must be the
first unit in your library"s USES clause AND your project"s (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }

3. Ипользовать виндозные процедуры выделения/освобождения таких блоков (GlobalAlloc, GlobalFree и т.д)



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

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

Наверх





Память: 0.57 MB
Время: 0.039 c
3-16894
nkrainev
2003-02-14 15:15
2003.03.06
Так как все-таки обрабатывать исключение


14-17380
Netizen
2003-02-18 08:52
2003.03.06
Кролики


3-16937
Олег2406
2003-02-14 11:12
2003.03.06
Замучала ошибка Invalid..Insufficient... Table: С ... _QSQ12.db


14-17372
orion_st
2003-02-18 14:55
2003.03.06
Get only Date from TMonthCalendar


3-16857
Korvin
2003-02-17 08:40
2003.03.06
rxBDGrid это не BDGrid (передача фокуса)





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