У меня есть две функции.
Одна представляет собой простое сложение двух целых чисел, эта работает как в программе C, так и в C# после экспорта в виде DLL.
Другая отправляет входной символ @
( Right Alt + V ) и работает в C / C ++, но не работает в C# при вызове из DLL. Возвращает 0
, как и должно быть, но вход не отправляется. Все скомпилировано как x64 и запущено от имени администратора.
Перед компиляцией в DLL есть только один файл:
#include <stdio.h>
#include <Windows.h>
extern "C"
{
__declspec(dllexport) int sendAtSymbolKey() {
INPUT input[4];
WORD vkey_right_alt = VK_RMENU; // right ALT key
WORD vkey_v = 0x56; // V key (alt+v = @)
input[0].type = INPUT_KEYBOARD;
input[0].ki.wScan = MapVirtualKey(vkey_right_alt, MAPVK_VK_TO_VSC);
input[0].ki.wVk = vkey_right_alt;
input[1].type = INPUT_KEYBOARD;
input[1].ki.wScan = MapVirtualKey(vkey_v, MAPVK_VK_TO_VSC);
input[1].ki.wVk = vkey_v;
input[2].type = INPUT_KEYBOARD;
input[2].ki.wScan = MapVirtualKey(vkey_v, MAPVK_VK_TO_VSC);
input[2].ki.wVk = vkey_v;
input[2].ki.dwFlags = KEYEVENTF_KEYUP;
input[3].type = INPUT_KEYBOARD;
input[3].ki.wScan = MapVirtualKey(vkey_right_alt, MAPVK_VK_TO_VSC);
input[3].ki.wVk = vkey_right_alt;
input[3].ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(4, input, sizeof(INPUT));
return 0;
}
__declspec(dllexport) int testAddTogether(int a, int b) {
return a + b;
}
}
C# file:
[DllImport("library2.dll")]
public static extern int sendAtSymbolKey();
[DllImport("library2.dll")]
public static extern int testAddTogether(int a, int b);
public static void Main(string[] args) {
Thread.Sleep(3000);
int shouldBeZero = sendAtSymbolKey();
Console.WriteLine(shouldBeZero); // 0
int sum = testAddTogether(11, 9);
Console.WriteLine(sum); // 20, which is correct
}
Функция testAddTogether()
работает нормально, но sendAtSymbolKey()
работает ничего. Ошибок нет.
Мне также интересно, почему мне не понадобился заголовочный файл для файла C / C ++? И в проекте DLL, и в проекте консольного приложения, где я звонил sendAtSymbolKey()
внутри main()
.