P/Invoke and LoadLibrary / GetProcAddress

A little snippet I wrote while trying to use LoadLibrary/GetProcAddress to call functions and get variable values that are exported by an unmanaged dll with P/Invoke.

extern "C" __declspec(dllexport) const char* _Version = "0.1";

extern "C" __declspec(dllexport) const char* GetMyVersion(void)
{
	return _Version;
}
[TestMethod]
public void TestPinvoke()
{
		IntPtr lib = LoadLibrary(@"C:\Documents and Settings\Administrator\My Documents\Visual Studio 2010\Projects\TestWinDll\Debug\TestWinDll.dll");
		if(lib == IntPtr.Zero)
				throw new Win32Exception(Marshal.GetLastWin32Error());

		IntPtr procAddress = GetProcAddress(lib, "GetMyVersion");
		var gmv = (GetMyVersion)Marshal.GetDelegateForFunctionPointer(procAddress, typeof(GetMyVersion));
		var ver = gmv();

		procAddress = Marshal.ReadIntPtr(GetProcAddress(lib, "_Version"));
		var ver2 = Marshal.PtrToStringAnsi(procAddress);

		if(!FreeLibrary(lib))
				throw new Win32Exception(Marshal.GetLastWin32Error());
}

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate String GetMyVersion();

[DllImport("kernel32", SetLastError = true, CharSet = CharSet.Unicode)]
static extern IntPtr LoadLibrary(string lpFileName);

[DllImport("kernel32", CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)]
static extern IntPtr GetProcAddress(IntPtr hModule, string procName);

[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool FreeLibrary(IntPtr hModule);
This entry was posted in Work and tagged , , , , . Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *