|
|
|
Приведение типов
|
|||
|---|---|---|---|
|
#18+
Добрый день. Вобще проблемма может быть и не в приведении типов, но мне так кажется. Значит есть сетевая функция которая принимает параметром 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", то пакеты уходят на заданный адресс. Вот собственно и вопрос. Я бился всю ночь пока не достиг состояния близкого к помешательству, буду признателен вам за любую оказанную помощь. Заранее благодарен Максим Заикин. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2006, 02:42 |
|
||
|
Приведение типов
|
|||
|---|---|---|---|
|
#18+
Дополнение вызывается не CreateProcess а CreateThread ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2006, 02:50 |
|
||
|
Приведение типов
|
|||
|---|---|---|---|
|
#18+
полный код, относящийся к проблеме приведите, включая определение структуры и функцию в dll ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2006, 10:05 |
|
||
|
Приведение типов
|
|||
|---|---|---|---|
|
#18+
К сожалению в силу объекивных причин полный код привести не имею возможности. Поэтому если что то непонятно задавайте конкретные вопросы я на них отвечу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2006, 17:45 |
|
||
|
Приведение типов
|
|||
|---|---|---|---|
|
#18+
Сложно что-то сказать, если кода нет. Возможно m_ip изменяется позже вне потока, но до использования её в потоке. 1) посмотри значение после завершения потока. 2) Объяви m_ip как Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2006, 18:01 |
|
||
|
Приведение типов
|
|||
|---|---|---|---|
|
#18+
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()); е) кстати релиз буферу не забывайте делать - это типичная ошибка, в плоскости утечки памяти... удачи Вам (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2006, 18:31 |
|
||
|
Приведение типов
|
|||
|---|---|---|---|
|
#18+
Может быть в строке 2 нужно поставить m_cstrdata вместо m_cipcntrl? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2006, 20:16 |
|
||
|
Приведение типов
|
|||
|---|---|---|---|
|
#18+
вот структура файл 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 передается. В айпишнике абсурд прога посылает пакеты и выводит инфу о успешности отпраки в листбокс. но айпишник она не может почему то передать я немогу понять в чем дел. Нид хэлп плииз ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2006, 18:11 |
|
||
|
Приведение типов
|
|||
|---|---|---|---|
|
#18+
MaximZaikin....Нид хэлп плииз написали много...тяжеловато...код не весь...посему предлагаются шаги по выведению данной проблемы из тьмы к свету... 1) попробуйте заменить Вашу нитку - подпрограммой. И позовите её синхронно. тем самым проверите код - вообще рабочий или нет...(я понимаю что глазками всё пучком:) ) 2) замените подпрограмму обратно на поток. После вызова потока вставте ожидание (например слип секунд на 10, но лучше синхро обьект ядра )... Обратите внимание на: -обращение к ресурсам по айди, если имеються - обязательно нужно переключать контекст на Вашу дэлеле ! -попытку сделать тук-тук из одного потока в другой на прямую, в обход диспетчера нитки. Тут надо ессесвенно использовать мэнеджер нитки, либо развязывать данные... -обращение к данным расположенным у Вас на стэке (в коде это видно, хотя стоит в коментах вроде бы решение которое это развязывает - аллокация под структуру передаваемую в нитку..хз) из другой нитки - тут не надо быть семь пядей во лбу, чтоб увидеть трабл (время жизни на стэке)... -рекомендую сделать синхронную фазу старта и финиша нитки (типичная ошибка - вылезает при различной загрузки самого писюка)... 3) результат экспериментов - в студию... ремарка по поводу ниток... не надо думать что нитка начинает жить сразу или с неким фиксированным запозданием. Это типичная ошибка. Воспринимайте нитку так, что она может сорваться с места ! А может вообще не стартануть пока Ваш основной поток не финиширует ! Посему, если Вы передаёте какие-либо данные обеспечьте СИНХРОННУЮ фазу старта - дабы убедиться, что она стартовала и приняла переданные данные (может в системе памяти ёк и она потерпела крах)..Если Вы финишируете в главной нитки - выставите финиш порождённым ниткам и проконтролируйте останов всех порождённых ниток. Это Вам поможет избежать утечек ресурсов и не корректного поведения программы в целом... удачи Вам (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2006, 19:01 |
|
||
|
Приведение типов
|
|||
|---|---|---|---|
|
#18+
О спасибо. Можно поподробнее про синхронный старт ) где капнуть ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2006, 19:12 |
|
||
|
Приведение типов
|
|||
|---|---|---|---|
|
#18+
MaximZaikinО спасибо. Можно поподробнее про синхронный старт ) где капнуть ? задача простая... добавляете в передаваемые параметры, либо глобально - синхро обьект ядра. Про синхро обьекты ядра - лучше Рихтера "Windows для профессионалов" вроде как не попадалось... 2 либо 3 издание - пофигу... с уважением (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2006, 19:18 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=362&tid=2031591]: |
0ms |
get settings: |
4ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
23ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
| others: | 196ms |
| total: | 280ms |

| 0 / 0 |
