#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int main(int argc, const char **argv)
{
	if (argc < 2) {
		fprintf(stderr, "Not enough arguments: dlopen FILE [SYMBOL...]\n");
		return EXIT_FAILURE;
	}
	HMODULE h = LoadLibrary(argv[1]);
	if (h == NULL) {
		fprintf(stderr, "Could not open %s: %s\n", argv[1],
			strerror(errno));
		DWORD err = GetLastError();
		LPVOID buf = NULL;
		FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
			FORMAT_MESSAGE_FROM_SYSTEM |
			FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err,
			MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
			(LPTSTR)&buf, 0, NULL);
		if (buf != NULL)
			fprintf(stderr, "R: %s\n", buf);
		return EXIT_FAILURE;
	}
	printf("Loaded %s at %p\n", argv[1], h);
	argc -= 2;
	argv += 2;
	while (argc-- > 0) {
		void *addr = GetProcAddress(h, *argv);
		printf("%s: %p\n", *argv, addr);
		++argv;
	}
	FreeLibrary(h);
	return EXIT_SUCCESS;
}
