2014-07-10 2 views
-1

Я использую win 7, встроенный с замененным проводником, чтобы система загружалась напрямую в мое приложение.Обнаружение при загрузке сетевого стека Win 7 embedded

То, что я нахожу, заключается в том, что к моменту начала моего приложения сетевой стек не готов, и я не могу привязываться к каким-либо сетевым адресам. К сожалению, это не простые сетевые требования с множеством различных резьбовых деталей, начиная с разного времени. Существует подключаемая система, которая может запускать сетевые интерфейсы, интерфейс telnet, поток широковещательной передачи UDP и т. Д.

Есть ли простой способ, когда мое приложение начинает обнаруживать, запущен ли сетевой стек?

Приложение в основном Delphi использует компоненты Indy (но плагины - C++ с использованием asio).

В настоящее время чит-решение заключается в том, чтобы поставить 4sec sleep перед «Application.Initialize», и он всегда запускается правильно. Если я поставлю сон после «Application.Initialize», значит, это говорит мне, что есть компоненты, которые выполняют WSAStartup в своей инициализации, и это то, что нарушает работу.

+0

Что INIT прок регистрируются? Это те вещи, которые выполняются во время 'Application.Initialize'. –

+0

Извините, как мне это перечислить. Я не знал, что это легко получить информацию. – Martin

+0

Ищите любые единицы в вашей программе, которые назначают 'InitProc'. Или просто перейдите через 'Application.Initialize' с включенными DCU. Вам действительно нужно убедиться, что вы понимаете, что происходит в «Application.Initialize» в вашей программе. –

ответ

2

Положите ожидающий вызов на WSAStartup в разделе initialization вашего устройства, пока сетевой успех не будет инициализирован.

unit NetworkWaitUnit; 

interface 

implementation 

uses 
    Windows, 
    yourWinSockUnit; 

var 
    WsaDataOnce: TWSADATA; 

const 
    WinsockLevel = $0202; 

initialization 
    while not WSAStartup(WinsockLevel, WsaDataOnce) do 
    sleep(100); 
end. 

Затем убедитесь, этот блок указан первым в списке .dpr uses единицы. В результате он будет вызываться перед всеми другими подразделениями, и ваша программа должна работать должным образом.

Нечто похожее:

program MyServer; 

uses 
    NetworkWaitUnit, // should be listed first to be called first 
    SysUtils, 
    ... 


end. 
+1

Я сделал быстрый тест, положив код, который вы предложили, в основной блок перед «Application.Initialize», и он, похоже, не поймал проблему. Я не могу понять, как это произойдет в разделе инициализации? – Martin

+0

@Martin Я думаю, что у вас мало смысла использовать пробную версию и ошибку. Вам нужно выяснить, что происходит в 'Application.Initialize'. На самом деле нет никакого смысла в том, чтобы догадываться. –

+0

Глядя на MSDN, это должно работать так, как вы описали. Он должен вернуть WSASYSNOTREADY, пока подсистема не будет запущена. – Martin

1

Проблема оказалась не быть сетевой стек, а конкретные интерфейсы. Когда запускались различные сетевые компоненты, они пытались привязываться к доступным портам. Поскольку приложение запускалось так быстро, физические порты не были доступны, и ничего не было связано.

Решение заключалось в том, чтобы написать сырую процедуру winsock, чтобы получить список доступных портов, и дождаться, пока число портов> 1 (необходимо учитывать петлю) в самом начале приложения.

Для справки это API я использовал, чтобы получить список интерфейсов:

WSAIoctl(fSocket, SIO_GET_INTERFACE_LIST, Nil, 0, @InterfaceList, sizeof(InterfaceList), @BytesRet, Nil, Nil); 
Смежные вопросы