#include #include HANDLE waitForCtrlBreakEvent; BOOL WINAPI CtrlHandler(DWORD fdwCtrlType) { switch (fdwCtrlType) { case CTRL_BREAK_EVENT: SetEvent(waitForCtrlBreakEvent); return TRUE; default: return FALSE; } } int main(void) { waitForCtrlBreakEvent = CreateEvent(NULL, TRUE, FALSE, NULL); if (!waitForCtrlBreakEvent) { fprintf(stderr, "ERROR: Could not create event\n"); return 1; } if (!SetConsoleCtrlHandler(CtrlHandler, TRUE)) { fprintf(stderr, "ERROR: Could not set control handler\n"); return 1; } // The library must be loaded after the SetConsoleCtrlHandler call // so that the library handler registers after the main program. // This way the library handler gets called first. HMODULE dummyDll = LoadLibrary("dummy.dll"); if (!dummyDll) { fprintf(stderr, "ERROR: Could not load dummy.dll\n"); return 1; } // Call the Dummy function so that Go initialization completes, since // all cgo entry points call out to _cgo_wait_runtime_init_done. if (((int(*)(void))GetProcAddress(dummyDll, "Dummy"))() != 42) { fprintf(stderr, "ERROR: Dummy function did not return 42\n"); return 1; } printf("ready\n"); fflush(stdout); if (WaitForSingleObject(waitForCtrlBreakEvent, 5000) != WAIT_OBJECT_0) { fprintf(stderr, "FAILURE: No signal received\n"); return 1; } return 0; }