我正在使用 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 _);
“不工作”部分是我唯一的问题。