2016-02-29 22 views
4

我試圖寫武裝突襲3 DLL延伸和game docs說:如何在Rust中爲ArmA 3 DLL實現RVExtension功能?

該DLL應該包含一個形式 _RVExtension的切入點@ 12,用下面的C簽名:

void __stdcall RVExtension(char *output, int outputSize, const char *function); 

C++代碼示例的一部分是:

// ... 

extern "C" { 
    __declspec(dllexport) void __stdcall RVExtension(
     char *output, 
     int outputSize, 
     const char *function 
    ); 
}; 

void __stdcall RVExtension(
    char *output, 
    int outputSize, 
    const char *function 
) { 
    outputSize -= 1; 
    strncpy(output,function,outputSize); 
} 

該文檔也有很多其他語言的例子如:C#, D and even Pascal,但那些幫助不大,因爲我沒有很好地理解他們的FFI =(。

我堅持用下面的代碼鏽:

#[no_mangle] 
pub extern "stdcall" fn RVExtension(
    game_output: *mut c_char, 
    output_size: c_int, 
    game_input: *const c_char 
) { 
    // ... 
} 

但武裝突襲拒絕調用它。

回答

5

感謝@ Shepmaster關於Dependency Walker的建議,我能夠發現問題出在函數的名字中。我預計函數名稱將被轉換爲[email protected],但事實並非如此。 RVExtension被直接輸出,而ArmA無法通過名稱[email protected]找到它。

這很奇怪,但似乎編譯器版本可能會起作用。我嘗試了〜8個不同的版本,並且能夠使其僅適用於Rust每夜1.8(GNU ABI)32位。

工作代碼爲:

#![feature(libc)] 
extern crate libc; 

use libc::{strncpy, size_t}; 

use std::os::raw::c_char; 
use std::ffi::{CString, CStr}; 
use std::str; 

#[allow(non_snake_case)] 
#[no_mangle] 
/// copy the input to the output 
pub extern "stdcall" fn _RVExtension(
    response_ptr: *mut c_char, 
    response_size: size_t, 
    request_ptr: *const c_char, 
) { 
    // get str from arma 
    let utf8_arr: &[u8] = unsafe { CStr::from_ptr(request_ptr).to_bytes() }; 
    let request: &str = str::from_utf8(utf8_arr).unwrap(); 

    // send str to arma 
    let response: *const c_char = CString::new(request).unwrap().as_ptr(); 
    unsafe { strncpy(response_ptr, response, response_size) }; 
} 

也可以重寫功能分爲:

#[export_name="_RVExtension"] 
pub extern "stdcall" fn RVExtension(

其他一些生鏽的編譯器還可以一起工作:

#[export_name="[email protected]"] 
pub extern "stdcall" fn RVExtension(

但,例如每晚1.8(MSVC ABI)與VS 2015的32位將不允許@符號d在編譯時拋出一個錯誤。 MSVC版本本身不會添加@12

其他編譯器可能會添加@12,該函數將導出爲[email protected]@12


還值得一提的是,ArmA是32位應用程序,所以它不適用於64位DLL。

+0

如何對Mingw做同樣的想法?似乎它發生類似的事情(https://forums.bistudio.com/topic/193084-building-extensions-on-mingw/?p=3073069) – xbelanch

+0

對不起,我沒有MinGW的經驗。 – Ridim