Каким образом можно устранить ошибку "linking with `link.exe` failed: exit code: 1120"?

Я разрабатываю драйвер и пытаюсь импортировать функцию NtGdiBitBlt, вызывая ее следующим образом: <br/> <pre><code class="rust">extern crate winapi;

use core::ffi::c_void;

extern "C" {
    pub fn NtGdiBitBlt(
        hdcDest: *mut c_void,
        xDest: i32,
        yDest: i32,
        cxDest: i32,
        cyDest: i32,
        hdcSrc: *mut c_void,
        xSrc: i32,
        ySrc: i32,
        rop: u32,
        brush: *mut c_void,
        xBrush: i32,
        yBrush: i32,
    ) -> i32;
}


pub fn kernel_draw_example() {
    unsafe {
        let hdc_dest: *mut c_void = 0 as *mut c_void; // Здесь должен быть фактический дескриптор контекста устройства
        let hdc_src: *mut c_void = 0 as *mut c_void;  // Здесь должен быть фактический дескриптор контекста устройства

        // Пример вызова NtGdiBitBlt
        let result = NtGdiBitBlt(
            hdc_dest,  // Дескриптор контекста назначения
            0,         // Позиция X
            0,         // Позиция Y
            100,       // Ширина
            100,       // Высота
            hdc_src,   // Дескриптор контекста источника (может быть null, если не нужен)
            0,         // Позиция X источника
            0,         // Позиция Y источника
            0x00CC0020, // Код операций над растровыми образами (например, SRCCOPY)
            core::ptr::null_mut(), // Кисть (необязательно)
            0,         // Позиция X кисти
            0,         // Позиция Y кисти
        );

        if result == 0 {
            // Обработка ошибки
        }
    }
}</code></pre> <br/> <br/> Код компилируется успешно, если не вызывать функцию, но при попытке вызова возникает ошибка: error: linking with `link.exe` failed: exit code: 1120 <br/> Более подробная информация о ошибке: <pre><code>error: linking with `link.exe` failed: exit code: 1120
  |
  = note: "C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.39.33519\\bin\\H
  • 19 сентября 2024 г. 9:33
Ответы на вопрос 2
Ошибка "linking with `link.exe` failed: exit code: 1120" обычно возникает, когда компилятор не может найти определение функции, указанной в коде, при попытке связывания (linking). Это может произойти по нескольким причинам:

1. **Функция не экспортируется**:
   `NtGdiBitBlt` может не быть доступна в вашем контексте. Убедитесь, что вы правильно импортируете эту функцию из нужной библиотеки.

2. **Необъявленная внешняя библиотека**:
   Убедитесь, что вы линковали нужную внешнюю библиотеку к вашему проекту. Например, для `NtGdiBitBlt`, которая определена в библиотеке `gdi32.dll`, вам нужно добавить `gdi32.lib` в секцию линковки.

3. **Неверные параметры функции**:
   Проверьте правильность всех передаваемых параметров в соответствии с документацией. Невозможность правильно скомпилировать функции может привести к ошибкам компоновки.

Чтобы устранить эту ошибку, вы можете попробовать выполнить следующие шаги:

### 1. Добавьте библиотеку в `Cargo.toml`

Если вы используете Cargo, убедитесь, что вы добавили необходимую библиотеку в ваш проект. Например, вам нужно указать `gdi32` в секции `build` вашего `Cargo.toml`:

```toml
[dependencies]
winapi = { version = "0.3", features = ["gdi32"] }
```

### 2. Используйте правильную аннотацию для линковки

Если у вас еще нет, создайте файл `build.rs` в корневом каталоге вашего проекта, и добавьте следующее:

```rust
fn main() {
    println!("cargo:rustc-link-lib=gdi32");
}
```

### 3. Проверьте наличие заголовков с функцией

Обычно функции WinAPI доступны через заголовочные файлы. Убедитесь, что у вас установлен правильный WinSDK, который включает в себя соответствующие файлы.

### 4. Пример использования функции в Rust

Убедитесь, что вы правильно объявили функцию. В вашем коде вы можете использовать `winapi::um::wingdi::NtGdiBitBlt` для получения доступа к этой функции при корректной настройке.

### 5. Проверьте типы данных

Убедитесь, что используете правильные типы данных для всех параметров функции.

### Пример кода с учетом всех замечаний

Вот пример, как можно изменить ваш код с учетом вышеупомянутых рекомендаций:

```rust
extern crate winapi;

use core::ffi::c_void;
use winapi::um::wingdi::BitBlt; // Импортируйте нужные функции
use winapi::shared::windef::HDC;

extern "C" {
    pub fn NtGdiBitBlt(
        hdcDest: HDC,
        xDest: i32,
        yDest: i32,
        cxDest: i32,
        cyDest: i32,
        hdcSrc: HDC,
        xSrc: i32,
        ySrc: i32,
        rop: u32,
        brush: *mut c_void,
        xBrush: i32,
        yBrush: i32,
    ) -> i32;
}

// Ваш код
```

Следуя этим указаниям, вы должны быть в состоянии устранить ошибку компоновки. Убедитесь в том, что все зависимости корректно установлены и правильно указаны в вашем проекте.
Надо линкеру указать dll-ку в которой эта функция определена. В документации не указано, в какой именно библиотеке оно лежит, но можно пропробовать Gdi32.dll или Ddraw.dll. Надо где-то в настройках проекта на вкладке про линкер указать эти dll.
Похожие вопросы