В настоящее время я участвую в проекте, который переносит старый код VB6 на C # (.Net Framework 3.5).Мой мандат состоит в том, чтобы просто выполнить миграцию;любые функциональные улучшения или рефакторинг должны быть перенесены на более позднюю фазу проекта.Не идеально, но вы идете.
Таким образом, часть кода VB6 вызывает функцию Windows API SetTimer.Я перенес это и не могу заставить его работать.
Перенос проекта строится как DLL;Я создал небольшой тестовый жгут WinForms, который связывается с DLL и вызывает соответствующий код.Очень просто, просто чтобы доказать, что вызов может быть выполнен.
Соответствующий код в перенесенной DLL выглядит следующим образом:
[DllImport("user32.dll", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public extern static int SetTimer(int hwnd, int nIDEvent, int uElapse, AsyncObjectCallerDelegate lpTimerFunc);
public delegate void AsyncObjectCallerDelegate(int hwnd, int uMsg, int idEvent, int dwTime);
static public int StartTimer( AsyncGeoServer.GeoWrapper AsyncObj)
{
m_objGeoWrapper = AsyncObj;
int lngReturn = SetTimer(0, 0, 1, new AsyncObjectCallerDelegate(AsyncObjectCaller));
// When the line below is removed, the call functions correctly.
// MessageBox.Show("This is a temp message box!", "Temp Msg Box", MessageBoxButtons.OKCancel);
return lngReturn;
}
static private void AsyncObjectCaller(int hwnd, int uMsg, int idEvent, int dwTime)
{
// Perform processing here - details removed for clarity
}
static public void StopTimer( int TimerID)
{
try { KillTimer(0, TimerID); }
catch { }
}
Вышеуказанные вызовы обернуты DLL во внешнемМетод DoProcessing ();это создает событие с использованием CreateEvent перед вызовом StartTimer (оба вызова ядра Windows), затем вызывает WaitForSingleObject перед продолжением обработки.Функция AsyncObjectCaller установит событие как часть своего выполнения, чтобы разрешить продолжение обработки.
Поэтому моя проблема заключается в следующем: если код вызывается так, как указано выше, происходит сбой.Метод обратного вызова AsyncObjectCaller никогда не запускается, и время ожидания WaitForSingleObject истекает.
Если, однако, я раскомментирую вызов MessageBox.Show в StartTimer, он работает как ожидалось ... вроде.Метод обратного вызова AsyncObjectCaller запускается сразу после вызова MessageBox.Show.Я попытался поместить MessageBox.Show в различные места в коде, и это независимо от того, где я его поместил (до тех пор, пока он вызывается после вызова SetTimer) - функция обратного вызова не срабатывает до тех пор, пока окно сообщения не будет
Я полностью озадачен и не слишком знаком с кодированием VB6 или Windows API, в основном из .Net фона.
Спасибо за любую помощь!