Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.04.2012, 01:03   #11
9esa
Пользователь
 
Регистрация: 26.02.2012
Сообщений: 20
По умолчанию

Печалька в том что это не работает у меня я уже испробовал во всех позициях это =(
Точнее работает только для разных объектов с разными длинами он выводит 1 и туже

Последний раз редактировалось 9esa; 25.04.2012 в 01:09.
9esa вне форума Ответить с цитированием
Старый 25.04.2012, 01:06   #12
9esa
Пользователь
 
Регистрация: 26.02.2012
Сообщений: 20
По умолчанию

А так спасибо огромное , не многие даже в живую могут понять=)
9esa вне форума Ответить с цитированием
Старый 25.04.2012, 01:09   #13
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Ну так приведите код, иллюстрирующий проблему.
Чтоб можно было сразу запустить и сказать: Ага, вот о чем автор говорил! Ну ща посмотрим...)
EUGY вне форума Ответить с цитированием
Старый 25.04.2012, 01:19   #14
9esa
Пользователь
 
Регистрация: 26.02.2012
Сообщений: 20
По умолчанию

Мой код к сожалению выложить не удастся, он насчитывает около 2 тысяч символов только в 1 файле и ещё пачка заголовочных файлов , а так код который запустить вот
Это в 1 проекте
Код:
string dddww,wwqeyu;
	dddww="aaaajndjlngdblnblfbnlbnzvcvcc";
	wwqeyu="2889";
	wtte(wwqeyu,224);
	wtte(dddww,888);
Это во втором
Код:
              string *n=(string*EspSt;
			if (n==0)
			{
				file<<"null";
				EspSt=EspSt+4;
			} 
			else
			{
				//file<<n;
				cout<<n->length();
				file<<" ";

				EspSt=EspSt+4;
				break;
			}
		}
Вот такой дамп памяти
0x0018FC90 00 00 00 00 ....
0x0018FC94 d4 fe 18 00 Фю..
0x0018FC98 00 38 38 39 .889
0x0018FC9C 00 ed 41 68 .нAh
0x0018FCA0 b8 88 41 00 ё€A. <-Здесь лежит наша строка (это расположение всегда разное в зависимости от длины)
0x0018FCA4 d4 fe 18 00 Фю..
0x0018FCA8 00 00 00 00 ....

Последний раз редактировалось 9esa; 25.04.2012 в 01:21.
9esa вне форума Ответить с цитированием
Старый 25.04.2012, 01:29   #15
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

То есть второй проект это длл?
А wtte - это функция, которая из нее экспортируется? или нет?

А то ведь может возникнуть подозрение, что пытаетесь из одного процесса читать память другого. Из приведенного отрывка кода этого конечно не понять.
EUGY вне форума Ответить с цитированием
Старый 25.04.2012, 01:37   #16
9esa
Пользователь
 
Регистрация: 26.02.2012
Сообщений: 20
По умолчанию

Да все верно это подключаемая dll.
а wtte это просто функция в 1 проекте типа void wtte(string t );
Моя задача в dll получить нашу передаваемою строку и вывести в файл. Ну это 1 из ветвей проекта.
9esa вне форума Ответить с цитированием
Старый 25.04.2012, 01:41   #17
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Так процесс один? Или же все-таки перехват функций из другого.
Объясните, как строка попадает в длл.
EUGY вне форума Ответить с цитированием
Старый 25.04.2012, 01:47   #18
9esa
Пользователь
 
Регистрация: 26.02.2012
Сообщений: 20
По умолчанию

Процесс 1. Мы компилируем наш проект с определенным ключом, этот ключ нам позволяет при каждом вызове функции перехватывать значения всех 7 регистров, мы их копируем в стек, потом вызываем функцию, делаем все что хотим с этими значениями и потом восстанавливаем наши значения , так вот я просто перехватываю с регистра вершину стека.
9esa вне форума Ответить с цитированием
Старый 25.04.2012, 02:27   #19
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Не вижу, как это выглядит в реальности, но проделав следующий тест:
Код:
void _stdcall func(void* ptr)
{

}

int main()
{
	std::string F;
	func(&F);
}
Вижу что указатель кладется в регистр EAX


Если же так:

Код:
void _stdcall func(std::string ff)
{

}

int main()
{
	std::string F;
	func(F);
}
То имеем в в вершине ESP адрес оригинала. А в EAX адрес копии.
Раз говорите, что перехватываете значения в вызове функции, то возможно конструктор копии еще не вызван. Хотя .... черт его знает

PS. Может кто с асмом дружит, подскажет.

Последний раз редактировалось EUGY; 25.04.2012 в 02:33.
EUGY вне форума Ответить с цитированием
Старый 25.04.2012, 02:37   #20
9esa
Пользователь
 
Регистрация: 26.02.2012
Сообщений: 20
По умолчанию

Да все верно вы правы, в ESP лежит адрес оригинала, поэтому вы правильно предложили решение
string* pmystr = (string*) someptr;
int len = pmystr->length();
Только вот предстоит разобраться почему же не получается получить адекватный размер, что же завтра покопают ещё.
Спасибо огромное за помощь =)
9esa вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Класс string, выделение памяти Стремящийся Общие вопросы C/C++ 1 17.03.2012 14:21
выделение памяти под объект VIK_aka_TOR Общие вопросы Delphi 4 15.02.2012 19:20
Загрузить текст из file.txt в объект String apromix JavaScript, Ajax 3 10.10.2011 09:06
Шаблоны - нужно создать объект класса abc в котором вместо aa использовался бы объект класса fff? Farrel Общие вопросы C/C++ 2 13.11.2010 17:37
Как получить адрес String строки или преобразовать String madboy4ik Общие вопросы по Java, Java SE, Kotlin 6 15.01.2010 11:57