質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

Q&A

解決済

1回答

658閲覧

RustでDIBSectionを扱いたい

NC_WS

総合スコア1

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

0グッド

0クリップ

投稿2022/06/27 14:40

http://www13.plala.or.jp/kymats/study/MULTIMEDIA/create_dibsection.html
にあるC言語で書かれたものをRustで表したく以下のようなコードを組んでみたのですがうまくいきません。(ウィンドウの作成などは省略しています。)
また、コンパイルは普通に成功します。

該当のソースコード

Rust

1unsafe extern "system" fn win_proc( 2 hwnd: HWND, 3 msg: UINT, 4 w_param: WPARAM, 5 l_param: LPARAM, 6) -> LRESULT { 7 match msg { 8 WM_DESTROY => { 9 PostQuitMessage(0); 10 } 11 WM_PAINT => { 12 let hdc = GetDC(hwnd); 13 let bmi: BITMAPINFO = BITMAPINFO { 14 bmiColors: [RGBQUAD { 15 rgbBlue: 0, 16 rgbRed: 0, 17 rgbGreen: 0, 18 rgbReserved: 0, 19 }], 20 bmiHeader: BITMAPINFOHEADER { 21 biBitCount: 32, 22 biClrImportant: 0, 23 biClrUsed: 0, 24 biCompression: 0, 25 biPlanes: 1, 26 biSize: mem::size_of::<BITMAPINFO>() as u32, 27 biSizeImage: 0, 28 biWidth: 200, 29 biHeight: 200, 30 biXPelsPerMeter: 0, 31 biYPelsPerMeter: 0, 32 }, 33 }; 34 let mut lpPixel: LPDWORD = ptr::null_mut(); 35 let hBitmap = CreateDIBSection( 36 hdc, 37 &bmi, 38 DIB_RGB_COLORS, 39 lpPixel as *mut *mut VOID, 40 ptr::null_mut(), 41 0, 42 ); 43 let hMemDC = CreateCompatibleDC(hdc); 44 SelectObject(hMemDC, hBitmap as *mut VOID); 45 46 for y in 10..40 { 47 for x in 10..40 { 48 *(lpPixel.offset(x + y * 200)) = 0x00ff0000; 49 } 50 } 51 Rectangle(hMemDC, 10, 10, 40, 40); 52 53 StretchDIBits( 54 hdc, 55 0, 56 0, 57 200, 58 200, 59 0, 60 0, 61 200, 62 200, 63 lpPixel as *mut VOID, 64 &bmi, 65 DIB_RGB_COLORS, 66 SRCCOPY, 67 ); 68 BitBlt(hdc, 0, 0, 200, 200, hMemDC, 0, 0, SRCCOPY); 69 70 ReleaseDC(hwnd, hdc); 71 DeleteDC(hMemDC); 72 DeleteObject(hBitmap as *mut VOID); 73 } 74 _ => return DefWindowProcW(hwnd, msg, w_param, l_param), 75 }; 76 0 77}

このまま実行すると、
error: process didn't exit successfully: target\debug\DIBTest.exe (exit code: 0xc000041d)
と出て、プログラムが強制終了してしまいます。
また、色々試した結果、*(lpPixel.offset(x + y * 200)) = 0x00ff0000 の行をコメントアウトすれば動くことは確認できました。

どなたか解決方法をご存じないでしょうか。

補足情報

winapi 0.3.9を使用しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

CreateDIBSectionの第四引数は出力になるので、&mutで参照を渡してあげる必要がありますね
元のページでもここは参照渡してるはず

rust

1let hBitmap = CreateDIBSection( 2 hdc, 3 &bmi, 4 DIB_RGB_COLORS, 5 &mut lpPixel as *mut *mut VOID, 6 ptr::null_mut(), 7 0, 8 );

投稿2022/06/28 02:21

編集2022/06/28 02:22
S.Percentage

総合スコア283

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

NC_WS

2022/06/28 07:45

無事動きました! ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問