передача указателя через обработчик событий
От: foxdayk  
Дата: 07.07.10 07:33
Оценка:
что не так делаю ?


.h-файл:

const WM_USERMESSAGE = WM_USER + 245;
....
private:
void __fastcall WMUserMessage(TMessage& Msg);

BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_USERMESSAGE, TMessage, WMUserMessage);
END_MESSAGE_MAP(TForm)

.c-файл:

упаковка:
void __fastcall TFormStart::ServerSocket1ClientConnect(TObject *Sender,
TCustomWinSocket *Socket)
{
String S = Socket->RemoteAddress; // получаем AnsiString — адрес клиента
String *P = &S; // получаем ссылку

PostMessage(Handle,WM_USERMESSAGE, (WPARAM)P, 0); // передаем ссылку
}

распаковка:
void __fastcall TFormStart::WMUserMessage(TMessage& Msg)
{
AnsiString *P = new AnsiString();
AnsiString *P = (AnsiString*)Msg.WParam;

String S = *P; // что то получаем, но не адрес клиента

if(Msg.LParam==0)
ListBox1->Items->Add(S);
}

12.07.10 13:13: Перенесено модератором из 'C/C++' — Кодт
c++ builder
Re: передача указателя через обработчик событий
От: kvasya  
Дата: 07.07.10 08:04
Оценка: 2 (2)
Здравствуйте, foxdayk, Вы писали:

F>что не так делаю ?



String S = Socket->RemoteAddress; // получаем AnsiString — адрес клиента
String *P = &S; // получаем ссылку

PostMessage(Handle,WM_USERMESSAGE, (WPARAM)P, 0); // передаем ссылку


Строка на стеке умирает.

Как оффтопик: мой вам совет, откажитесь от c++ builder.
Re: передача указателя через обработчик событий
От: March_rabbit  
Дата: 07.07.10 08:04
Оценка: 1 (1) +1 :)
Здравствуйте, foxdayk, Вы писали:

F>что не так делаю ?

как минимум, не знаешь что такое "С/С++". Это не программа в VisualStudio. Это язык. а твой вопрос -> в другой форум (например, "прикладные вопросы").
Re: передача указателя через обработчик событий
От: kvasya  
Дата: 07.07.10 08:09
Оценка: +1
Здравствуйте, foxdayk, Вы писали:

F>что не так делаю ?


void __fastcall TFormStart::ServerSocket1ClientConnect(TObject *Sender,
TCustomWinSocket *Socket)
{
String S = Socket->RemoteAddress; // получаем AnsiString — адрес клиента
String *P = &S; // получаем ссылку

SendMessage(Handle,WM_USERMESSAGE, (WPARAM)P, 0); // передаем ссылку
}

или


void __fastcall TFormStart::ServerSocket1ClientConnect(TObject *Sender,
TCustomWinSocket *Socket)
{
String S = Socket->RemoteAddress; // получаем AnsiString — адрес клиента
String *P = new String( S );
...
}
void __fastcall TFormStart::WMUserMessage(TMessage& Msg)
{
...
ListBox1->Items->Add(S);
}
delete S;


Это только "чтоб заработало".
Re: передача указателя через обработчик событий
От: Ops Россия  
Дата: 08.07.10 08:59
Оценка:
Здравствуйте, foxdayk, Вы писали:

Попробуйте разобраться, что такое AnsiString изнутри, сразу станет понятно, что через WPARAM в сообщении Вы его не передадите. Если так уж требуется использовать Win-сообщения, то используйте WM_USER или передавайте атомы.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re: передача указателя через обработчик событий
От: PanychY  
Дата: 08.07.10 09:19
Оценка:
Здравствуйте, foxdayk, Вы писали:

1) --> рвздел WIN API

2) А маршалить память кто вместо Вас будет, Ленини?
Как уже говорилось, либо передавайте атомы и другие данные которые влазят в WPARAM/LPARAM, либо ручной маршалинг, либо воспользуйтесь сообщениями которые маршалятся системой автоматически (например WM_SETTEXT маршалит строку LPARAM, WM_COPYDATA маршалит буфер указанной длины)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.