0

新しい RAD Studio Xe4 を手に入れることができるので、試してみようと思いました。残念ながら、私は C++ の経験があまりないので、なぜ VC++ で完全に機能するコードが C++ Builder ではまったく機能しないのか疑問に思っていました。問題のほとんどは、異なる var-type を変換することです。例えば ​​:

std::string Test = " ";
GetFileAttributes(Test.c_str());

VC++ では動作しますが、C++ Builder ではコンパイルされません。同じ?ありがとう

4

3 に答える 3

6

Windows Unicode/ASCII 地獄へようこそ。

関数

GetFileAttributes

Windowsヘッダーを含めるときに定義されているか(または定義されていたか、GetFileAttributesAまたは両方か)GetFileAttributesWに応じて、実際にはマクロが定義されています。バリアントは takeと関連する引数、関数は takeと関連する引数をとります。_UNICODEUNICODE*Achar**Wwchar_t*

新しいコードでは、ワイド*Wバリアントのみを直接呼び出すことをお勧めします。これは、Windows のみのコードの std::wstring への切り替えと、クロスプラットフォーム アプリケーションのよく考えられた設計の選択を意味します。

于 2013-04-23T14:51:07.870 に答える
1

C++ Builder 構成は、UNICODE 文字セットを使用するように設定されています。これは、Win32 API がワイド文字バージョンに解決されることを意味します。したがって、C++ コードではワイド char 文字列を使用する必要があります。UNICODE を使用するように VS 構成を設定すると、同じエラーが発生します。

これを試すことができます:

// wstring = basic_string<wchar_t>
// _T macro ensures that the specified literal is a wide char literal
std::wstring Test = _T(" ");     
GetFileAttributes(Test.c_str()); // c_str now returns const wchar_t*, not const char* 

_T/_TEXT マクロの詳細については、http://docwiki.embarcadero.com/RADStudio/XE3/en/TCHAR_Mapping を参照してください

于 2013-04-23T14:52:04.590 に答える
1

_UNICODEand/orUNICODEを Builder で定義し、VC で定義していません。

ほとんどの Windows API には、ANSI フレーバーと UNICODE フレーバーの 2 つのフレーバーがあります。

を呼び出すとSetWindowText、実際には関数がありませんSetWindowText。代わりにSetWindowTextA、ANSI 文字列を受け取る関数とSetWindowTextWUNICODE 文字列を受け取る関数の 2 つがあります。

プログラムが /DUNICODE /D_UNICODE でコンパイルされている場合、SetWindowTextSetWindowTextW which expects aconst wchar_t *` にマップされます。

これらのマクロを定義せずにプログラムをコンパイルするSetWindowTextAと、const char *.

Windows ヘッダーは通常、これを実現するために次のようなことを行います。

#ifdef UNICODE
#define SetWindowText  SetWindowTextW
#else
#define SetWindowText  SetWindowTextA
#endif 

同様に、 2 がありますGetFileAttributes

DWORD WINAPI GetFileAttributesA(LPCSTR lpFileName);

DWORD WINAPI GetFileAttributesW(LPCWSTR lpFileName);

VC では、UNICODE/_UNICODE を定義していないため、string::c_str()を返すものを渡すことができますchar *

Builder では、おそらく UNICODE/_UNICODE を定義しており、wchar_t *.

この UNICODE/_UNICODE 処理を明示的に行っていない可能性があります (IDE が行っている可能性があります)。そのため、IDE のオプションを確認してください。

これを修正する方法はたくさんあります

  • IDE で UNICODE/_UNICODE オプションを見つけて無効にします。

また

  • 使用std::w_string- その後c_str()wchar_t *

また

  • GetFileAttributesA代わりに直接呼び出すGetFileAttributes- これら 2 つのバリアントに付属する他のすべての Windows API に対してこれを行う必要があります。
于 2013-04-23T14:52:04.697 に答える