CPallini
Да, вы можете это сделать, конечно.
Я бы написал следующее: Dowork
функция таким образом
Dowork(ProgressCallback funcaddr)
{
if ( funcaddr != 0)
{
while(true)
{
res = funcaddr(pinfo);
}
}
}
В любом случае:
- Где
res
определились?
- А также, Где находится
pinfo
определились?
- Почему вы повторяете бесконечный цикл, просто отбрасывая возвращаемое значение обратного вызова?
Member 14087451
на самом деле это код DLL пользовательского режима, который получает информацию от драйвера, который он отправляет в пользовательский интерфейс и получает оттуда resonse, res - это ответ
pinfo-это PACKETINFO, который он отправляет в пользовательский интерфейс
Member 14087451
в настоящее время я сталкиваюсь с проблемой, что dll пользовательского режима непрерывно отправляет информацию в приложение пользовательского интерфейса, которое делает сбой приложения пользовательского интерфейса, я хочу, чтобы если мы отправим ответ в другом потоке приложение пользовательского интерфейса получит больше времени для ответа на dll пользовательского режима
Member 14087451
полный код похож на
структура typedef
{
char *домен;
char *Uri;
Тип uint32 при;
Порт тип uint32 ;
int Direction; //0:-входящий,1:-исходящий
}PACKETINFO, *PPACKETINFO;
typedef int(CALLBACK *ProgressCallback)(PACKETINFO *info);
PPACKETINFO pinfo = { 0 };
const int ALLOW = 1;
const int BLOCK = 0;
Метода dowork(ProgressCallback funcaddr)
{
в то время как(правда)
{
если (!PacketsRecv(ручка, пакет, размер(пакета), &ампер;packet_len, &ампер;Эл))
{
fprintf(stderr, "предупреждение: не удалось прочитать пакет (%d)\n",
И getlasterror());
продолжить;
}
//printf("прием пакета....\n");
ParsePacket(packet, packet_len, &ip_header, NULL,
Нуль, нуль, нуль, &ампер;tcp_header, значение null, &ампер;груза, &ампер;payload_len,
НУЛЬ, НУЛЬ);
если (ip_header == нуль || tcp_header == нуль || грузоподъемность == нуль)
{
// Packet не соответствует черному списку; просто повторно вставьте его.
if (!PacketSend(handle, packet, packet_len, NULL, &addr))
{
fprintf(stderr, "warning: failed to reinject packet (%d)\n",
И getlasterror());
}
продолжить;
}
int response = 0;
если(funcaddr !=0 )
{
//обратный вызов отправить сюда
ответ = funcaddr(pinfo);
}
бесплатно(pinfo);
pinfo = NULL;
если (ответ == разрешить )
{
// Packet не соответствует черному списку; просто повторно вставьте его.
if (!PacketSend(handle, packet, packet_len, NULL, &addr))
{
fprintf(stderr, "warning: failed to reinject packet (%d)\n",
И getlasterror());
}
продолжить;
}
иначе мы заблокируем его, угнав машину.
// соединение.
}
}