powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Приведение типов
12 сообщений из 12, страница 1 из 1
Приведение типов
    #33642353
MaximZaikin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.
Вобще проблемма может быть и не в приведении типов, но мне так кажется.
Значит есть сетевая функция которая принимает параметром char* inet_addr(char *). Есть дилоговое окно на котором расположен элемент CIPAdressCntrl m_cipcntrl. В этот эллемент вводится ip адресс. Есть кнопка на форме "Старт". По нажатию на которую примерно происходит следующее :

CString m_cstrdata;
PDataS m_pdatas;

PS
PData это структура, в которой среди прочих есть такое объявление переменной :
.......
char *m_ip;
.......
далее,

1 cipcntrl.GetWindowText(m_cstrdata);
2 pdata.m_ip = m_cipcntrl.GetBuffer(m_cipcntrl.GetLength());

Примечательно что в дебагере все в порядке ставлю точки останова проверяю переменнные на заполненность и соответсвие введеным данным, все в порядке.
Самое интересное начинается дальше
Дальше идет функция CreateProcess, котороя вызыввает функцию с моей dll и параметром туда передается моя структура. Заранее скажу что эта часть программы отвечает за посылку пакетов. Так вот введя адрес например 10.61.0.23, пакеты отправляются на 255.255.255.0. Но это еще не все ;) Если я заменю строку 2 на вот такую pdata.m_ip = "10.61.0.23", то пакеты уходят на заданный адресс.
Вот собственно и вопрос.
Я бился всю ночь пока не достиг состояния близкого к помешательству, буду признателен вам за любую оказанную помощь.
Заранее благодарен Максим Заикин.
...
Рейтинг: 0 / 0
Приведение типов
    #33642356
MaximZaikin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дополнение вызывается не CreateProcess а CreateThread
...
Рейтинг: 0 / 0
Приведение типов
    #33642621
saint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полный код, относящийся к проблеме приведите, включая определение структуры и функцию в dll
...
Рейтинг: 0 / 0
Приведение типов
    #33644316
MaximZaikin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К сожалению в силу объекивных причин полный код привести не имею возможности. Поэтому если что то непонятно задавайте конкретные вопросы я на них отвечу.
...
Рейтинг: 0 / 0
Приведение типов
    #33644370
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сложно что-то сказать, если кода нет. Возможно m_ip изменяется позже вне потока, но до использования её в потоке.
1) посмотри значение после завершения потока.
2) Объяви m_ip как
Код: plaintext
1.
char m_ip[ 16 ];
И коппируй туда строку с ip
...
Рейтинг: 0 / 0
Приведение типов
    #33644468
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximZaikin
CString m_cstrdata;
PDataS m_pdatas;

PS
PData это структура, в которой среди прочих есть такое объявление переменной :
.......
char *m_ip;
.......
далее,

1 cipcntrl.GetWindowText(m_cstrdata);
2 pdata.m_ip = m_cipcntrl.GetBuffer(m_cipcntrl.GetLength());
.........

1) метод GetLength() возвращает длину аллокированной памяти, поэтому с ним поаккуратней. для него нули - такие же данные как и "1" к примеру...
2) пастарайтесь перед второй строчкой вывести в дебаг, либо на консоль стандартной механизацией следующую инфу...
а) cipcntrl
б) m_cstrdata (хотя не понятно нафига в него Вы сохраняетесь, либо опять обращаетесь к элементу диалога (? - хз)...
в) значение m_cipcntrl.GetLength()
г) значение m_cipcntrl.GetBuffer(тут заведомо правильная длина)
д) m_cipcntrl.GetBuffer(m_cipcntrl.GetLength());
е) кстати релиз буферу не забывайте делать - это типичная ошибка, в плоскости утечки памяти...


удачи Вам
(круглый)
...
Рейтинг: 0 / 0
Приведение типов
    #33644669
pirovindos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может быть в строке 2 нужно поставить m_cstrdata вместо m_cipcntrl?
...
Рейтинг: 0 / 0
Приведение типов
    #33647257
MaximZaikin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот структура файл dll.h
typedef struct _retpdata {
CListBox* m_list;
CEdit* m_editaddr;
CString datastr;
char* m_ip;
int i_packcnt;
}RetPData;

extern __declspec(dllexport) DWORD WINAPI __stdcall WNet32Ping(LPVOID lpParam);

dll.cpp

extern __declspec(dllexport) DWORD WINAPI __stdcall WNet32Ping(LPVOID lpParam){

WSADATA wsaData;
SOCKET sockRaw = INVALID_SOCKET;
struct sockaddr_in dest;
struct sockaddr_in from;

int bread;
int bwrote;
int fromlen = sizeof(from);
int timeout = 1000;
int ret;
PVOID icmp_data = NULL;
PVOID recvbuf = NULL;
unsigned int addr = 0;
short seq_no = 0;
struct hostent *hp = NULL;
IpOptionHeader ipopt;
BOOL datasize = 32;
BOOL m_bcheckok = FALSE;
CString m_cip;
HANDLE hThread;
DWORD dwThreadId;
char *lpdest;
RetPData* retp = new RetPData;
CListBox *m_list;
int nCount;

lpdest = NULL;
retp = (RetPData*)lpParam;
m_list = retp->m_list;
strcpy(lpdest,retp->m_ip);
lpdest = retp->m_ip;


nCount = 0;

в дебагере сморю ссылка на CListBox нулевая в занчении ip сидит адрес вобще левый какой то. Да бог с ним я бы понял если бы при попытке записи в лист бокс прога вылетала так ведь нет работает. Если только не в дебагере ее запустить.

prog.cpp
по событи нажатия на кнопку

int items_cnt;
RetPData retp;
BOOL is_enabled;
CString code;


//retp = new RetPData;
DWORD dwThreadId;
items_cnt = m_mmm.GetCount();
char *buf= new char;
buf = NULL;





m_editaddr.GetWindowText(code);
buf = code.GetBuffer(code.GetLength());
// retp.m_ip = code.GetBuffer(code.GetLength());
strcpy(retp.m_ip, code.GetBuffer(code.GetLength()));



retp.m_list = &m_mmm;
retp.m_editaddr = &m_editaddr;

hPingThread = CreateThread( NULL,0,WNet32Ping,(LPVOID)&retp,0,&dwThreadId);
CloseHandle(hPingThread);


все у меня крыша едет дом стоит три дня кувыркаюсь. В коде приведенном есть много недоработок я о них знаю там куча лишних переменных и где не логичные вызовы просьба на это не обрашать внимания.
Проблема как писалось выше при вызове функции из dll туда ip не передается но вот указатель на listbox передается. В айпишнике абсурд прога посылает пакеты и выводит инфу о успешности отпраки в листбокс. но айпишник она не может почему то передать я немогу понять в чем дел.
Нид хэлп плииз
...
Рейтинг: 0 / 0
Приведение типов
    #33647373
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximZaikin....Нид хэлп плииз

написали много...тяжеловато...код не весь...посему предлагаются шаги по выведению данной проблемы из тьмы к свету...

1) попробуйте заменить Вашу нитку - подпрограммой. И позовите её синхронно. тем самым проверите код - вообще рабочий или нет...(я понимаю что глазками всё пучком:) )
2) замените подпрограмму обратно на поток. После вызова потока вставте ожидание (например слип секунд на 10, но лучше синхро обьект ядра )... Обратите внимание на:
-обращение к ресурсам по айди, если имеються - обязательно нужно переключать контекст на Вашу дэлеле !
-попытку сделать тук-тук из одного потока в другой на прямую, в обход диспетчера нитки. Тут надо ессесвенно использовать мэнеджер нитки, либо развязывать данные...
-обращение к данным расположенным у Вас на стэке (в коде это видно, хотя стоит в коментах вроде бы решение которое это развязывает - аллокация под структуру передаваемую в нитку..хз) из другой нитки - тут не надо быть семь пядей во лбу, чтоб увидеть трабл (время жизни на стэке)...
-рекомендую сделать синхронную фазу старта и финиша нитки (типичная ошибка - вылезает при различной загрузки самого писюка)...
3) результат экспериментов - в студию...

ремарка по поводу ниток...
не надо думать что нитка начинает жить сразу или с неким фиксированным запозданием. Это типичная ошибка. Воспринимайте нитку так, что она может сорваться с места ! А может вообще не стартануть пока Ваш основной поток не финиширует ! Посему, если Вы передаёте какие-либо данные обеспечьте СИНХРОННУЮ фазу старта - дабы убедиться, что она стартовала и приняла переданные данные (может в системе памяти ёк и она потерпела крах)..Если Вы финишируете в главной нитки - выставите финиш порождённым ниткам и проконтролируйте останов всех порождённых ниток. Это Вам поможет избежать утечек ресурсов и не корректного поведения программы в целом...


удачи Вам
(круглый)
...
Рейтинг: 0 / 0
Приведение типов
    #33647388
MaximZaikin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О спасибо. Можно поподробнее про синхронный старт ) где капнуть ?
...
Рейтинг: 0 / 0
Приведение типов
    #33647399
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximZaikinО спасибо. Можно поподробнее про синхронный старт ) где капнуть ?

задача простая...
добавляете в передаваемые параметры, либо глобально - синхро обьект ядра. Про синхро обьекты ядра - лучше

Рихтера
"Windows для профессионалов"

вроде как не попадалось...
2 либо 3 издание - пофигу...


с уважением
(круглый)
...
Рейтинг: 0 / 0
Приведение типов
    #33647412
MaximZaikin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понял щас почитаю. Спасибо
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Приведение типов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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