Функция работает в консольном приложении C / C ++, не работает при добавлении в качестве DLL к C# - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть две функции.
Одна представляет собой простое сложение двух целых чисел, эта работает как в программе 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().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...