MBCSとUNICODEの混在 – プログラミング – Home

通知
すべてクリア

[解決済] MBCSとUNICODEの混在


シャロ
 シャロ
(@シャロ)
ゲスト
結合: 19年前
投稿: 5
Topic starter  

タイトルの通りのことは可能でしょうか?
具体的に言うと、ダイアログアプリでMBCSで作ってます。
これにCOMで作られた機能を組み込もうとしたら
COMで作ったソースがUNICODE(WCHAR?)になってて
コンパイルしたらMFCのライブラリが競合しますと言われます。
初心者なので言ってることが変かもしれませんが
よろしくお願いします。


引用未解決
トピックタグ
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

VCでCOM(OCX)の作成するとビルド環境にUNICODE版とそうでない版が出てきますが、
UNICODE版でない方のOCXは手に入らないのですか?
Win98とかWinMeとかで動かさないならダイアログアプリの方をUNICODEにする方法も
あると思いますけれど。


返信引用
シャロ
 シャロ
(@シャロ)
ゲスト
結合: 19年前
投稿: 5
Topic starter  

レスありがとうございます。
COMだからUNICODEではないのですね。
しかし、以下のコードがエラーになってしまいます。
プロジェクトはUNICODEではないので
LPWSTRもTCHARもcharになると思うのですが…

m_aaa.szItemID = new TCHAR[100];
(m_aaa.szItemIDはLPWSTRとなっています。)

エラー内容:error C2440: '=' : 'TCHAR *' から 'LPWSTR' に変換できません。

このエラーを無くすにはどうすればいいのでしょうか?

あと、ダイアログをUNICODEにするのは大変なので
UNICODEの機能を何とかしたいです。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

> LPWSTRもTCHARもcharになると思うのですが…
LPWSTRは wchar_t* です。
(farはとりあえず無視で)

LPTSTR は LPWSTR か LPSTR で切り替わると思いますけど。


返信引用
NowNow
 NowNow
(@NowNow)
ゲスト
結合: 20年前
投稿: 27
 

> LPWSTRもTCHARもcharになると思うのですが…

LPWSTRはUnicodeでもMBCSでもWCHARのはずです。


返信引用
NowNow
 NowNow
(@NowNow)
ゲスト
結合: 20年前
投稿: 27
 

ぅ、Blueさんとかぶった・・・orz


返信引用
NowNow
 NowNow
(@NowNow)
ゲスト
結合: 20年前
投稿: 27
 

> LPWSTRはUnicodeでもMBCSでもWCHARのはずです。
WCHAR *のはずです。

ポインタです。*が抜けてました。すみません・・・orz


返信引用
シャロ
 シャロ
(@シャロ)
ゲスト
結合: 19年前
投稿: 5
Topic starter  

レスありがとうございます。

>m_aaa.szItemID = new TCHAR[100];
左側が市販品のヘッダファイルに定義されてるので
右側をWCHARにする必要があるということですね。
これでエラーは消えました。
m_aaa.szItemID = new WCHAR[100];
COM機能のインターフェース部分を
全てWCHAR対応にすることで解決しようと思います。


返信引用
シャロ
 シャロ
(@シャロ)
ゲスト
結合: 19年前
投稿: 5
Topic starter  

新たなエラーが出てしまいました。

nafxcwd.lib(afxmem.obj) : error LNK2005:
void * __cdecl operator new(unsigned int) (??2@YAPAXI@Z) は既に LIBCMTD.lib
(new.obj) で定義されています。
nafxcwd.lib(afxmem.obj) : error LNK2005:
void __cdecl operator delete(void *) (??3@YAXPAX@Z) は既に LIBCMTD.lib
(dbgdel.obj) で定義されています。
nafxcwd.lib(afxmem.obj) : error LNK2005:
void * __cdecl operator new[](unsigned int) (??_U@YAPAXI@Z) は既に LIBCMTD.lib
(new2.obj) で定義されています。
nafxcwd.lib(afxmem.obj) : error LNK2005:
void __cdecl operator delete[](void *) (??_V@YAXPAX@Z) は既に LIBCMTD.lib
(delete2.obj) で定義されています。

これはどうしたらいいんでしょうか…


返信引用
RAPT
 RAPT
(@RAPT)
ゲスト
結合: 22年前
投稿: 310
 

# この情報だけでは何とも…

ヘッダファイルに定義を書いていませんか?
ヘッダは宣言のみ、実装は.CPPファイルに、宣言と定義を分離しましょう。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

市販品と自作プログラムでリンクしているCRTが違うんでない?


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 22年前
投稿: 320
 

[PRB] C ランタイム ライブラリを MFC ライブラリより先にリンクしたときの LNK2005
エラー
http://support.microsoft.com/default.aspx?scid=kb;ja;148652
これだと思いますが。
# LNK2005でググると最初に出てきます。


返信引用
シャロ
 シャロ
(@シャロ)
ゲスト
結合: 19年前
投稿: 5
Topic starter  

皆さんレスありがとうございます。

http://support.microsoft.com/default.aspx?scid=kb;ja;148652
ここのとおりやったら解決しました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました