digitalmars.D.learn - More WinAPI problems
- DLimited (143/143) Jul 20 2012 Hello everyone,
- Regan Heath (8/13) Jul 20 2012 How are you passing the DLL filename to LoadLibraryA/W? Are you passing...
- mta`chrono (4/4) Jul 20 2012 Do you know DependencyWalker? It might help you to check dependencies.
- Kagamin (3/3) Jul 21 2012 INPUT doesn't match C declaration and probably has wrong size.
Hello everyone, I encountered a few more problems while creating my system-wide makro program. 1) I can't load my dll with LoadLibraryW, only LoadLibraryA. Why? 2) The LoadLibraryA function "fails" with Error Code 127 - I still get a Handle and can register my function as a LowLevelKeyboardProc, so I'm not really sure what went wrong. Google tells me Code 127 means my .dll is dependant on other .dlls which can't be found, but I have no idea which/why/how. 3) I intend to use the SendInput function to simulate Unicode character presses - to be precise, I want to inject this --> ಠ_ಠ <-- whenever I press CTRL+SHIFT+ALT+Q (for example). Sadly SendInput gives me Error Code 87 ("Incorrect Parameter"), but I don't know what I'm doing wrong. I hope you guys can help me out! This is the .dll code: < ----- CODE BEGIN ----- > import std.c.windows.windows; import core.sys.windows.dll; import core.runtime; import std.stdio; //const auto INPUT_KEYBOARD = 1; //const auto KEYEVENTF_UNICODE = 4; extern (C) void gc_init(); extern (C) void gc_term(); extern (C) void _minit(); extern (C) void _moduleCtor(); extern (C) void _moduleDtor(); extern (Windows) struct KBDLLHOOKSTRUCT { DWORD vkCode; DWORD scanCode; DWORD flags; DWORD time; ULONG_PTR dwExtraInfo; }; extern (Windows) struct KEYBDINPUT { WORD wVk; WORD wScan; DWORD dwFlags; DWORD time; ULONG_PTR dwExtraInfo; }; extern (Windows) struct INPUT { DWORD type; KEYBDINPUT ki; }; extern (Windows) LRESULT CallNextHookEx( HANDLE hhk, int nCode, WPARAM wParam, LPARAM lParam ); extern (Windows) SHORT GetKeyState( int nVirtKey ); extern (Windows) UINT SendInput( UINT nInputs, INPUT* pInputs, int cbSize ); __gshared HINSTANCE g_hInst; extern (Windows) BOOL DllMain(HINSTANCE hInstance, ULONG ulReason, LPVOID pvReserved) { g_hInst = hInstance; switch (ulReason) { case DLL_PROCESS_ATTACH: g_hInst = hInstance; Runtime.initialize; //dll_process_attach( hInstance, true ); break; case DLL_PROCESS_DETACH: //dll_process_detach( hInstance, true ); break; case DLL_THREAD_ATTACH: //dll_thread_attach( true, true ); break; case DLL_THREAD_DETACH: //dll_thread_detach( true, true ); break; default: return true; } return true; } extern (Windows) LRESULT LowLevelKeyboardProc(int code, WPARAM wParam, LPARAM lParam) { Runtime.initialize; //MessageBoxA(null, "HALLO", "OK",0); KBDLLHOOKSTRUCT* details = cast(KBDLLHOOKSTRUCT*) lParam; if(code == 0 && wParam == WM_KEYDOWN) { if(details.vkCode == 0x51) { SHORT shiftkey = GetKeyState( VK_SHIFT ); SHORT ctrlkey = GetKeyState( VK_CONTROL ); SHORT altkey = GetKeyState ( VK_MENU ); if( ( shiftkey == -127 || shiftkey == -128 ) && ( ctrlkey == -127 || ctrlkey == -128 ) && ( altkey == -127 || altkey == -128 ) ) { //MessageBoxA(null, "BOOM", "OK",0); INPUT[3] toSend = new INPUT[3]; toSend[0].type = 1; toSend[0].ki.wVk = 0; toSend[0].ki.wScan = 0x0CA0; toSend[0].ki.dwFlags = 4; toSend[0].ki.time = 0; toSend[0].ki.dwExtraInfo = details.dwExtraInfo; toSend[1].type = 1; toSend[1].ki.wVk = 0; toSend[1].ki.wScan = 0x005F; toSend[1].ki.dwFlags = 4; toSend[1].ki.time = 0; toSend[1].ki.dwExtraInfo = details.dwExtraInfo; toSend[2].type = 1; toSend[2].ki.wVk = 0; toSend[2].ki.wScan = 0x0CA0; toSend[2].ki.dwFlags = 4; toSend[2].ki.time = 0; toSend[2].ki.dwExtraInfo = details.dwExtraInfo; SendInput( cast(UINT)3, toSend.ptr, toSend[0].sizeof ); writeln(GetLastError()); //MessageBoxA(null, cast(char*)GetLastError(), "OK",0); return 1; } } } return CallNextHookEx(null, code, wParam, lParam); } < ----- CODE END ----- >
Jul 20 2012
On Fri, 20 Jul 2012 14:07:51 +0100, DLimited <tanojoshu googlemail.com> wrote:Hello everyone, I encountered a few more problems while creating my system-wide makro program. 1) I can't load my dll with LoadLibraryW, only LoadLibraryA. Why?How are you passing the DLL filename to LoadLibraryA/W? Are you passing a string literal, i.e. LoadLibraryW("C:\\folder\dllname.dll"); Have you tried the string literal suffix 'w', e.g. LoadLibraryW("C:\\folder\dllname.dll"w); R
Jul 20 2012
Do you know DependencyWalker? It might help you to check dependencies. Here is a screenshot: http://oldcigaret.info/win2k/DependWguidepics/DependW_2.jpg and it's freeware. http://www.dependencywalker.com/
Jul 20 2012
INPUT doesn't match C declaration and probably has wrong size. Also to properly handle errors first check return code and then last error.
Jul 21 2012