Z
Kannst du mir bei der DLL helfen? Ich habe eine reguläre statisch gegen die MFC gelinkte DLL als Projekt erstellt. Die .CPP der DLL enthält folgendes:
// [...]
// Shared Data Segment (in der .def Datei erwähnt unter SECTIONS)
#pragma data_seg("MyTool")
HHOOK hHook=NULL;
HWND hNotifyWnd=NULL;
#pragma data_seg()
// [...]
// Meine MouseProc
static LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (wParam == WM_RBUTTONUP && hNotifyWnd)
SendMessage(hNotifyWnd, WM_RBUTTONUP, wParam, lParam);
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
// Funktion zum Starten
extern "C" void MonitorMouse(HWND hWnd)
{
if (hHook)
UnhookWindowsHookEx(hHook);
hHook = SetWindowsHookEx(WH_MOUSE, MouseProc, NULL, NULL);
hNotifyWnd = hWnd;
}
// Funktion zum Beenden
extern "C" void StopMonitorMouse(void)
{
if (hHook)
UnhookWindowsHookEx(hHook);
hHook = NULL;
}
Und nun die .CPP meines Programms:
// [...]
// Funktionszeiger definieren
typedef void (*TMonitorMouse) (HWND);
typedef void (*TStopMonitorMouse) ();
// ...
// Destruktor
CMyToolDlg::~CMyToolDlg()
{
// Destruktor
if (m_hDLL) {
TStopMonitorMouse pStopMonitorMouse = NULL;
pStopMonitorMouse = (TStopMonitorMouse) GetProcAddress(m_hDLL, "StopMonitorMouse");
if (pStopMonitorMouse)
(*pStopMonitorMouse) ();
FreeLibrary(m_hDLL);
}
}
// ...
// Message Map
BEGIN_MESSAGE_MAP(CMyToolDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_MOUSEMOVE()
ON_WM_RBUTTONUP()
//}}AFX_MSG_MAP
ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST, OnLvnItemchangedList)
END_MESSAGE_MAP()
// ...
// OnInitDialog()
BOOL CMyToolDlg::OnInitDialog()
{
// [...]
TMonitorMouse pMonitorMouse = NULL;
m_hDLL = LoadLibrary("DLL.dll");
if (m_hDLL) {
pMonitorMouse = (TMonitorMouse) GetProcAddress(m_hDLL, "MonitorMouse");
if (pMonitorMouse)
(*pMonitorMouse) (GetSafeHwnd());
} else {
MessageBox("Unable to load DLL.dll!\nProgram exiting.", "Error", MB_OK|MB_ICONERROR);
PostMessage(WM_CLOSE,NULL,NULL);
}
return TRUE;
}
// ...
// Eventfunktionen
void CMyToolDlg::OnRButtonUp(UINT nFlags, CPoint point)
{
AfxMessageBox(_T("RButtonUp!"));
}
void CMyToolDlg::OnMouseMove(UINT nFlags, CPoint point)
{
m_PosX.Format("%d", point.x);
m_PosY.Format("%d", point.y);
UpdateData(false);
}
Es kompiliert mal wieder ohne Fehler, funktioniert aber dennoch nur auf die Oberfläche des Programms selbst beschränkt. Irgendwelche Tips? Danke!
zony