| 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; | |
| } | |