Параметры ф-и
От: romzes  
Дата: 16.09.02 08:28
Оценка:
Здравствуйте,

Есть ф-я которая, получает указатель на строку

void _stdcall str_to(char *sStr)
{
char sTmp[4];

strncpy(sTmp, sStr, 2);
sTmp[2] = 0;

sStr +=3;
strncpy(sTmp, sStr, 2);
sTmp[2] = 0;


sStr +=3;
strncpy(sTmp, sStr, 4);
sTmp[4] = 0;
}

После вызова этой ф-и из DLL, получаю диалог

Debug error!

The value of ESP was not properly saved by across a function call. This is usaully
a result of calling a function declared with one calling convention with a function
pointer declared with a different calling convention.

В чем проблема, для ф-й везде использую stdcall?
Re: Параметры ф-и
От: Kaa Украина http://blog.meta.ua/users/kaa/
Дата: 16.09.02 08:31
Оценка:
Здравствуйте romzes, Вы писали:

R>    char sTmp[4];
...
R>    sTmp[4] = 0;


Это называется "перезапись" (overwrite). Элементов в sTmp 4 штуки, а ты пишешь в пятый.
Алексей Кирдин
Re: Параметры ф-и
От: romzes  
Дата: 16.09.02 08:34
Оценка:
Здравствуйте romzes, Вы писали:

R>Здравствуйте,


R>Есть ф-я которая, получает указатель на строку


R>void _stdcall str_to(char *sStr)

R>{
R> char sTmp[4];

R> strncpy(sTmp, sStr, 2);

R> sTmp[2] = 0;

R> sStr +=3;

R> strncpy(sTmp, sStr, 2);
R> sTmp[2] = 0;
R>

R> sStr +=3;

R> strncpy(sTmp, sStr, 4);
R> sTmp[4] = 0;
R>}

R>После вызова этой ф-и из DLL, получаю диалог


R>Debug error!


R>The value of ESP was not properly saved by across a function call. This is usaully

R>a result of calling a function declared with one calling convention with a function
R>pointer declared with a different calling convention.

R>В чем проблема, для ф-й везде использую stdcall?


Когда тело ф-и пустое, то ошибок нет
Re: Параметры ф-и
От: Павел Кузнецов  
Дата: 16.09.02 08:36
Оценка:
Здравствуйте romzes, Вы писали:

R>void _stdcall str_to(char *sStr)

R>{
R> char sTmp[4];
<...>
R> sTmp[4] = 0;
R>}
<...>
R>The value of ESP was not properly saved by across a function call.

R>В чем проблема, для ф-й везде использую stdcall?


В данном случае догадка компилятора не оправдалась. Дело в строке `sTmp[4] = 0'. В массиве у тебя всего 4 элемента, а ты пишешь за пределы массива — в пятый.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.