如何初始化没有默认特征的数据类型(例如 IWICBitmapFrameEncode)?

问题描述 投票:0回答:0

我正在使用 windows-rs,Windows API 的官方包。 通常我对数据对象初始化没有问题,我可以用几种方法来做,例如:

    let bitmap = BITMAP::default(); //initialize a BITMAP object

或者如果它是一个结构,我可以像这样填写一些值:

let prop1 = D2D1_RENDER_TARGET_PROPERTIES {
            dpiX: Default::default(),
            dpiY: Default::default(),
            ..Default::default()
        };

或者有一些函数可以用来做初始化,就像下面的代码一样,我初始化了 3 个对象:工厂、流和编码器,都没有任何问题。

let factory: IWICImagingFactory = CoCreateInstance(&CLSID_WICImagingFactory,None,CLSCTX_INPROC_SERVER)?;
        let encoder = hr.CreateEncoder(&GUID_ContainerFormatJpeg, &GUID_VendorMicrosoft)?;
        let stream: IWICStream = hr.CreateStream()?;
        stream.InitializeFromMemory(&output)?;
        encoder.Initialize(&stream, WICBitmapEncoderNoCache)?;

但是涉及到这个对象:IWICBitmapFrameEncode,我就没有头绪了。首先,我必须初始化它,否则无法使用,我不能像在 c++ 中那样声明它:

IWICBitmapFrameEncode *pFrameEncode = NULL; //this is enough for c++ but not for rust!

所以这是我尝试过的:

let frame = IWICBitmapFrameEncode::default(); //default not found.
let frame: IWICBitmapFrameEncode = Default::default(); //default not found.
let frame = IWICBitmapFrameEncode::Initialize(&self, None); //Initialize method does exist,
//but it takes 2 parameters, the first one is &self which I cannot provide. 

所以我试过:

let frame: IWICBitmapFrameEncode;
frame.Initialize(None); // This way it only takes one parameter (which can be set to None) but the complier still complains: used binding `frame` isn't initialized.

我很确定这个 IWICBitmapFrameEncode 它不是其他函数的返回值,所以我也不能那样初始化它。所以我被卡住了。

IWICBitmapFrameEncode 的定义:

pub struct IWICBitmapFrameEncode(pub ::windows::core::IUnknown);
impl IWICBitmapFrameEncode {
    #[doc = "*Required features: `\"Win32_System_Com_StructuredStorage\"`*"]
    #[cfg(feature = "Win32_System_Com_StructuredStorage")]
    pub unsafe fn Initialize<P0>(&self, piencoderoptions: P0) -> ::windows::core::Result<()>

还有:https://learn.microsoft.com/en-us/windows/win32/api/wincodec/nn-wincodec-iwicbitmapframeencode

在 C++ 中,它只是两行代码,我想做的就是在 Rust 中做同样的事情。我如何将 c++ 中的以下代码转换为 rust:

IWICBitmapFrameEncode *pFrameEncode = NULL; //initialization done!
hr = pEncoder->CreateNewFrame(&pFrameEncode, NULL); //now it can be used to receive value!

注意:在我可以使用 CreateNewFrame 接收值之前,我必须先初始化它。我坚持初始化部分。

如果你对我正在尝试做的事情的整个背景感兴趣。我正在尝试将位图数据编码为 JPG 数据(使用 Direct2d 接口)是全部:

let hr: IWICImagingFactory = CoCreateInstance(&CLSID_WICImagingFactory,None,CLSCTX_INPROC_SERVER)?;
        let encoder = hr.CreateEncoder(&GUID_ContainerFormatJpeg, &GUID_VendorMicrosoft)?;
        let stream: IWICStream = hr.CreateStream()?;
        stream.InitializeFromMemory(&output)?;
        encoder.Initialize(&stream, WICBitmapEncoderNoCache)?;
        let frame: IWICBitmapFrameEncode = IWICBitmapFrameEncode::Initialize(&self as _, None); //not working
       // frame.Initialize(None); //not working
        let frameopt = Some(frame);
        encoder.CreateNewFrame(&frameopt as *const Option<IWICBitmapFrameEncode> as _, &mut None as _);

“不工作”部分是我唯一的问题。

windows winapi rust wic
© www.soinside.com 2019 - 2024. All rights reserved.