###前提・実現したいこと
Direct2D (Windows Imaging Component利用) で
画像を読み込む処理を行う関数をDLL化して
C#側でDllImportして利用したいです。
###発生している問題・エラーメッセージ
画像を読み込むことができませんでした。
また、AccessViolationException も発生しました。
###該当のソースコード
C++
1bool init() 2{ 3 // COMを初期化する 4 HRESULT result = CoInitializeEx(NULL, /*COINIT_MULTITHREADED*/COINIT_APARTMENTTHREADED); 5 6 // WICイメージングファクトリを生成する 7 result = CoCreateInstance( 8 CLSID_WICImagingFactory, 9 NULL, 10 CLSCTX_INPROC_SERVER, 11 IID_IWICImagingFactory, 12 (LPVOID*)&wicImagingFactory); 13 14 // いろいろと省略してます! 15} 16 17int loadImage(const wchar_t* fileName) 18{ 19 IWICBitmapDecoder* wicBitmapDecoder = NULL; 20 IWICBitmapFrameDecode* wicBitmapFrame = NULL; 21 IWICFormatConverter* wicFormatConverter = NULL; 22 ID2D1Bitmap* bitmap = NULL; 23 24 // Bitmapデコーダを生成する 25 HRESULT result = wicImagingFactory->CreateDecoderFromFilename( 26 fileName, 27 NULL, 28 GENERIC_READ, 29 WICDecodeMetadataCacheOnLoad, 30 &wicBitmapDecoder); 31 32 // 画像からフレームを読み込む 33 result = wicBitmapDecoder->GetFrame(0, &wicBitmapFrame); 34 35 // フォーマットコンバータを生成する 36 result = wicImagingFactory->CreateFormatConverter(&wicFormatConverter); 37 38 // コンバータの初期化をする 39 result = wicFormatConverter->Initialize( 40 wicBitmapFrame, 41 GUID_WICPixelFormat32bppPBGRA, 42 WICBitmapDitherTypeNone, 43 NULL, 44 0, 45 WICBitmapPaletteTypeCustom); 46 47 // Bitmapを生成する 48 result = renderTarget->CreateBitmapFromWicBitmap( 49 wicFormatConverter, 50 NULL, 51 &bitmap); 52 53 // いろいろと省略してます! 54 // ちなみに読み込まれたbitmapはC++側でコレクションに保持されて 55 // 認識番号をつけてその認識番号を返すような実装にしています! 56}
C#
1using System.Runtime.InteropServices; 2 3static class Hoge 4{ 5 6 // 原因は不明だが、CallingConvention.Cdeclはつけないとデバッグビルド時にエラーが起こる (こちらの方も教えてくれたら嬉しいです!) 7 [DllImport("Native.dll", CallingConvention = CallingConvention.Cdecl)] 8 public static extern int loadImage(string fileName); 9}
###試したこと
COMの設定が悪いと思ったので
CoIntializeEX関数の第2引数を変えてみたり、
C#のMain関数に
[STAThread] をつけたり消したりしましたが、
例外が発生したり
例外が発生しなかったものの読み込みができていなかったりしました。
7/8追記
こちらにCoInitializeは不要であるようなことが書かれていたので
CoInitializeを呼ばずに実行してみましたが、
やはりダメでした。
また、wicImaginigFactoryはNULLではなかったので
COM関係では問題ないようですが、
Bitmapデコーダの生成では
HRESULTがS_OKでなかったようなのでここで失敗しているようです。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/08 06:28