powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Delphi6 + FoxPro8
8 сообщений из 8, страница 1 из 1
Delphi6 + FoxPro8
    #33638607
IgorProgrammer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня есть библиотека написанная на дельфине (она кодирует записи)...

function nado_uznat(chto_kod1, chto_kod2 :string; kodir_ras :integer) : Pchar; stdcall; export;

И прога для перезаписи полей...
SET ESCAPE ON
DECLARE string vernul IN a strin, strin, INTEGER
DECLARE string kodir IN a strin

Код: plaintext
REPLACE kodstik1 WITH my_rep('kodstik1',ALIAS())

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
PROCEDURE my_rep
	PARAMETERS my_fields, my_alias, stat_f
	STORE  1  TO begunok
	my_new = IIF(stat_f,shifr_1(ALLTRIM(&my_alias..&my_fields),'', 1 ),shifr_2(ALLTRIM(&my_alias..&my_fields),'', 1 ))
	DO WHILE LEN(my_new) > FSIZE(my_fields,my_alias) AND begunok <  1000  AND TYPE(FIELD(my_fields,my_alias)) # "M"
		my_new = IIF(stat_f,shifr_1(ALLTRIM(&my_alias..&my_fields),'', 1 ),shifr_2(ALLTRIM(&my_alias..&my_fields),'', 1 ))
		begunok = begunok +  1 
		IF begunok >=  1000 
			MESSAGEBOX('mlya')
			susp
		ENDIF
	ENDDO
RETURN my_new

PROCEDURE shifr_2
	PARAMETERS pervay, vtoroy, chto
	STORE  1  TO begunok
	pervay = ALLTRIM(pervay)
	vtoroy = ALLTRIM(vtoroy)
	chto = IIF(TYPE("chto")#"N", 0 ,chto)
	my_can_ret = vernul(pervay,'',chto) && получаю шифрованные данные
	IF !EMPTY(chto)
		my_true_znach = vernul(my_can_ret,'', 2 ) && получаю разшифрованные данные
		DO WHILE pervay # my_true_znach AND begunok <  1000 
			my_can_ret = vernul(pervay,vtoroy,chto) && получаю шифрованные данные
			my_true_znach = vernul(my_can_ret,'', 2 ) && получаю разшифрованные данные
			begunok = begunok +  1 
		ENDDO
		IF begunok >=  1000 
			MESSAGEBOX('mlya')
			susp
		ENDIF
	ENDIF
RETURN ALLTRIM(my_can_ret)
Иногда при вызове библиотечной функции vernul
Возникает ошибка 2027 -> Declare DLL call caused an exception.

стоит обработчик ошибок
Код: plaintext
1.
2.
3.
4.
5.
	DO CASE
		CASE my_err =  2027 
			RETRY
		OTHERWISE
			susp
	ENDCASE
И прога зацикливается...
Если ее останоить по ESCAPE и в дебагере пройти по-ШАГОВО...
то все нормально работает...

В чем может быть проблема...
...
Рейтинг: 0 / 0
Delphi6 + FoxPro8
    #33638617
mvictor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
у тебя в Delphi sharemem вставлено ?

а лучше все строки передавай указателями , мож оно и попустит :)
...
Рейтинг: 0 / 0
Delphi6 + FoxPro8
    #33639874
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi IgorProgrammer!

> В чем может быть проблема...

Ну чётко же написано - внешняя функция вызвала исключение. Фокс тут не при
чём - писать и компилировать функции нужно корректно - особенно в плане
работы с памятью. Также вызывают подозрение некоторые из используемых типов
параметров...

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Delphi6 + FoxPro8
    #33641056
IgorProgrammer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Наставил в дельфине
try
except

И ошибку выдало на:
Код: plaintext
tmps:=tmps+chr(ord(text[i]) xor ord(key[j]));
text и key строковые переменные...
key - константа
text - любой текст включая спец.-символы

Причем при возникновении ошибки стоит showmessage(text)
Который вызывает ошибку...
Такое впечатление что text = Null

Что в принципе исключено...
Код: plaintext
func(alltrim(my_can_ret),'', 2 ) &&Вызов

Код: plaintext
1.
2.
3.
4.
5.
6.
function func(chto_kod1, chto_kod2 :string; kodir_ras :integer) : Pchar; stdcall; export;
  nado_uznat := Pchar(chto_kod1);
  if chto_kod1='' then
  begin
...
  end;
end;
...
Рейтинг: 0 / 0
Delphi6 + FoxPro8
    #33641205
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NULL - это НЕ определенное значение. Т.е. это ни в коем случае не пустая строка - это неизвестно что.

Поэтому сравнение типа if chto_kod1='' - некорректно. Если значение равно NULL, то это условие выполнено не будет.

Поищи в Delphi специальные функции для определения значения типа NULL. Вероятно, что-то вроде

IF chto_kod1 IS NULL ...
...
Рейтинг: 0 / 0
Delphi6 + FoxPro8
    #33641367
IgorProgrammer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мона так:
1. if kod1=null then kod1:='';
2. if VarIsNull(kod1)l then:='';
Эт я уже поставил...
Так на всякий пожарный...

Меня интерисует при каких значениях двух символов эта комбинация вызовет ошибку
Код: plaintext
chr(ord(text[i]) xor ord(key[j]))

Проверял комбинации
Код: plaintext
1.
2.
3.
4.
5.
6.
  for i :=  1  to  256  do
  begin
    for j :=  1  to  256  do
    begin
      chto_kod1:= chto_kod1 + chr(i xor j)+# 10 ;
    end;
  end;
ошибки нет...
...
Рейтинг: 0 / 0
Delphi6 + FoxPro8
    #33641442
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это уж ты сам смотри в отладчике, чему равно text и key[j] при наступлении ошибки. Может быть, тот же NULL.
...
Рейтинг: 0 / 0
Delphi6 + FoxPro8
    #33642347
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi IgorProgrammer!

> Меня интерисует при каких значениях двух символов эта комбинация вызовет
> ошибку
> chr(ord(text ) xor ord(key[j]))

C чего ты взял что ЭТА конструкция вызывает ошибку?
Я бы сказал что скорее всего вызывает ошибку конструкция

tmps:=tmps+неважно_какой_символ;

Это как раз и есть конструкция, вызывающая перераспределение памяти (строка
увеличивается в размерах). Извини, я в Дельфи не силён, больше ничего умного
не скажу...

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Delphi6 + FoxPro8
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]