wchar_t*型は渡せないエラーの解決方法

このQ&Aのポイント
  • 現在、ifjpeg.spiのDLLファイルで画像データを表示させるプログラムを作成中です。
  • ビルド時に'wchar_t *' 型は 'char *' 型に変換できないエラーが発生しています。
  • 解決方法を教えてください。
回答を見る
  • ベストアンサー

”wchar_t*型は渡せない”というエラー

現在、ifjpeg.spiのDLLファイルで画像データを表示させるプログラムを作成中です。 このプログラムで、 if( IsSupported(OpenDialog->FileName.c_str(),theFile) != 0 ) このプログラムでビルドを行うと次のようなエラーが出ます。 [BCC32 エラー] Unit1.cpp(106): E2034 'wchar_t *' 型は 'char *' 型に変換できない [BCC32 エラー] Unit1.cpp(106): E2340 1 番目のパラメータは char * 型として定義されているので wchar_t * 型は渡せない ”IsSupported”は ProcIsSupported IsSupported = (ProcIsSupported)GetProcAddress(hSPI, "IsSupported"); このように宣言していて、 typedef int __stdcall (*ProcIsSupported)(LPSTR,DWORD); このようなプログラムなのですが、解決方法を教えて頂けませんでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

質問するには、もう少し情報があった方がいいでしょう。 既にある回答の情報から、C++ Builder のようですが、2009 or 2007 以降、ダイアログにある文字データの型が AnsiString から、UnicodeString に替わりました。 このため、c_str() をとっても、char * ではなく、wchar_t* が帰ってきます。 で、横着をするのなら、UnicodeString が AnsiString にキャスト可能であることを使って、 if( IsSupported(OpenDialog->FileName.c_str(),theFile) != 0 ) を、 if( IsSupported(static_cast<AnsiString>(OpenDialog->FileName).c_str(),theFile) != 0 ) と、一度 AnsiString にしてから、.c_str() をとると、char * が帰ってきます。

diy_sunny
質問者

お礼

回答頂きありがとうございます m(_ _)m   ”wchar_t char 変換” この手の型に関する話とかホントに理解が乏しくて、どうにかしたいです・・・。 いつもすみませんです。 どうにか、解決できてDLLファイルを呼び出して画像表示できました!

その他の回答 (1)

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

似たようなエラーで何度か質問をしているようですが…… # http://okwave.jp/qa/q7466514.html # http://okwave.jp/qa/q7465903.html 何が問題なのか理解していますか? 回答で示された修正方法をコピペしただけで、何が問題になっているのか理解していない為にこのような質問を繰り返しているのではないかと思いますが……。 # Susieプラグイン使うなら、unicodeではなくmbcsにプロジェクト自体を設定した方がいいかと思いますけどね。 # C++ Builder 2009は使っていないので具体的な対策はちょっと不明ですが。 「wchar_t char 変換」で検索すると、相互変換する方法を説明しているページが見つかると思いますので、 OpenDialog->FileName.c_str()で渡すのではなく、char型での文字列に変換したものを渡せばよいでしょう。

diy_sunny
質問者

お礼

回答頂きありがとうございます m(_ _)m   ”wchar_t char 変換” この手の型に関する話とかホントに理解が乏しくて、どうにかしたいです・・・。 いつもすみませんです・・・

関連するQ&A

  • LoadLibraryでのエラーについて

    TEditコンポ-ネットに書かれた文字列でdllファイルを指定するため HINSTANCE hSPI = LoadLibrary(PluginNameEdit->Text.c_str()); このようなプログラムを書いたところ次のようなエラーがでてしまいます。 [BCC32 エラー] Unit1.cpp(30): E2034 'wchar_t *' 型は 'const char *' 型に変換できない [BCC32 エラー] Unit1.cpp(30): E2342 パラメータ 'lpLibFileName' は const char * 型として定義されているので wchar_t * は渡せない 解決する方法を教えて頂けないでしょうか? 使ってるのはCode Gear C++ Builder 2009です。

  • LoadLibraryでのエラーについて2

    ”ifjpeg.spi”というDLLファイルをよびだすプログラムを作成して、ビルドしたところエラーがでました。 HINSTANCE hSPI = LoadLibrary( gPluginFiles[i] ); この行では次のようなエラーが出ました。 [BCC32 エラー] Unit1.cpp(53): E2034 'const char *' 型は 'const wchar_t *' 型に変換できない [BCC32 エラー] Unit1.cpp(53): E2342 パラメータ 'lpLibFileName' は const wchar_t * 型として定義されているので const char * は渡せない ”gPluginFiles”については次のように宣言しています。 const char *gPluginFiles[] = { "ifjpeg.spi",NULL, }; このプログラムのエラーの解決方法を教えて頂けませんでしょうか? 使用している開発環境はCode Gear C++ Builder 2009 です。

  • テキストボックスのファイルパスでfp=open

    C++ Builder2009でプログラムやってます。 テキストボックスEdit2-Textにファイルパスが入っているので、 fp = fopen( Edit2->Text , "wb" ); このようにしてファイル出力を行おうとしたら次のようなエラーが出てきました。 [BCC32 Error] Unit1.cpp(384): E2034 Cannot convert 'UnicodeString' to 'const char *' [BCC32 Error] Unit1.cpp(384): E2342 Type mismatch in parameter '__path' (wanted 'const char *', got 'UnicodeString') エラー内容だと”Edit2-Text”はUnicodeString型なので、fp = fopen にはconst char *っていう型にしないといけないという意味だと思うのですが、fopenでファイルパスをテキストボックスから渡すにはどのようにしたらよいか、ご教授よろしくお願い致します。

  • OpenDialogからテキストファイルの読み込み

    void __fastcall TForm1::N1Click(TObject *Sender) {     FILE *fp;      if(OpenDialog1->Execute()) { FNN1 = ExtractFilePath(OpenDialog1->FileName)         fp = fopen(FNN1.c_str(), "r" );              fread(txtdata,2,360,fp); } } [C++ エラー] Unit1.cpp(52): E2034 'AnsiString' 型は 'void *' 型に変換できない というエラーがでます。 解決方法を教えてください。

  • HINSTANCEの型

    LPSTR は char* なので、 int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE hPrevInstance , LPSTR lpCmdLine ,int nCmdShow ) を int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE hPrevInstance , char* lpCmdLine ,int nCmdShow ) と書き換えてもコンパイルできます。 HINSTANCEはvoid *型だという記述を見たのですが、void *で書き換えてもエラーがでてしまいます。 どうしたらよいのでしょうか。

  • CStringをwchar_tに変換したい

    CStringをwchar_tに変換したく思い、ネットで探したところ、 http://msdn2.microsoft.com/ja-jp/library/ms235631(VS.80).aspx のページを見つけたので、下記のプログラムを組んで実行してみましたがエラーになって しまいます。 【プログラム】 CString orig("Hello, World!"); // Convert to a char* const size_t newsize = 100; // Convert to a wchar_t* // You must first convert to a char * for this to work. size_t origsize = strlen(orig) + 1; size_t convertedChars = 0; wchar_t wcstring[newsize]; mbstowcs_s(&convertedChars, wcstring, origsize, orig, _TRUNCATE); 【エラー】 error C2664: 'strlen' : 1 番目の引数を 'CString' から 'const char *' に変換できません。 error C2664: 'mbstowcs_s' : 4 番目の引数を 'CString' から 'const char *' に変換できません。 &CStrinをconst char *でキャストしてもうまくいきません。 どこがおかしいのでしょうか? 【環境】 WindowsXP+VC++2005

  • 実行時dllを動かしたい

    のですがサイトで見つけたdllの作り方を見て 大人気の無償Borland C++5.51を使って //mydll.cpp #include <windows.h> BOOL __stdcall MyBeep() { return MessageBeep(0); } int __stdcall MyMessageBox(LPCTSTR lpszMessage) { return MessageBox(NULL,lpszMessage,"",0); } を bcc32 -WD mydll してmydll.dllを作り //myexe.cpp #include <windows.h> typedef int (__stdcall *pMyFunction)(LPCTSTR); int APIENTRY WinMain(HINSTANCE,HINSTANCE,LPSTR,int) { HINSTANCE hLib; pMyFunction pMyMessageBox; hLib = LoadLibrary("mydll.dll"); if(hLib) { pMyMessageBox=(pMyFunction)GetProcAddress(hLib,"MyMessageBox"); if(pMyMessageBox)(*pMyMessageBox)("HELLO!!"); FreeLibrary(hLib); } return 0; } を bcc32 -W myexe してmyexe.exeを作り myexe.exe したのですがHELLO!!がでません。 どうしたらいいのでしょうか?

  • C++Builder 2009 テキストボックスの文字列取得

    Editは、テキストボックスです。 Editには、"12345"の半角文字列が入っています。 これを、C言語の文字列として取得しようとしました。 このときのソースコードは、次の通り。 -------- char *ptr1 = new char[Edit->Text.Length()+1]; //独自領域にセーブ strcpy(ptr1, Edit->Text.c_str()); //ptr1にアドレスをコピー -------- このstrcpyの行で、エラーが出てしまい、対処に困っています。     ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ E2034 'wchar_t *' 型は 'const char *' 型に変換できない E2342 パラメータ '__src' は const char * 型として定義されているので wchar_t * は渡せない -------- Edit->Textで取得した文字列を、"12345\0"といった具合で処理をしたいのですが、どのようにしたらいいのでしょうか? 追記 「C++Builder 2009」以前のバージョンでは、難なく取得できていた。 同じソースコードなのに、何故かエラーになる。

  • 標準関数strlenの型size_tがわからない

    標準関数strlenの型size_tがわかりません int a; char ss[80]; . . . a = (int)strlen( ss ); とやってもコンパイルエラーです 型違いのようです。 調べたのですがsize_t型なんて知りません。 なぜですか(size_t型って何でしょうか)? どうすれば使えるのでしょうか? 宜しくお願い致します

  • エラーの原因は?「この関数の定義が見つかりません」

    <プログラム環境> Windows XP VC++6.0 MFC AppWizard(exe) ダイアログベース <症状> ヘッダー void Transmit(HANDLE,OVERLAPPED,unsigned char[],DWORD,CString); cppファイル void CMyDlg::Transmit(HANDLE hCom,OVERLAPPED old,unsigned char ucBuf[],DWORD dwByte,CString s) { } とコーディングしていて、ビルドも実行も全く問題ないのですが、 ClassViewでTransmit(HANDLE,OVERLAPPED,unsigned char[],DWORD,CString) をダブルクリックして、関数に移ろうとすると 『この関数の定義(インプリメンテーション)が見つかりません』 というエラーが出ます。 <質問> このエラーは何が原因で出ているのでしょうか?? 宜しければご指摘の程お願い致します。

専門家に質問してみよう