1

アプリケーション用の DLL を作成しています。アプリケーションは DLL を呼び出し、長さが 8 ~ 50 の文字列を受け取ります。

私が抱えている問題は、アプリケーションが受信したメッセージの最初の文字だけが表示されることです。

以下は GetMethodVersion 関数です。

#include "stdafx.h"
STDAPI_(void) GetMethodVersion(LPTSTR out_strMethodVersion, int in_intSize)
{
   if ((int)staticMethodVersion.length() > in_intSize)
       return;
   _tcscpy_s(out_strMethodVersion, 12, _T("Test")); 
   //staticMethodVersion should be insted of _T("Test")
}

プロジェクト設定は Unicode に設定されています。いくつかの調査の結果、Unicode 形式とその機能に問題があると確信しています。ご協力いただきありがとうございます。

4

2 に答える 2

2

プロジェクト設定は Unicode であると質問に書きましたが、これは DLL と呼び出し元の EXE の両方に当てはまりますか? 両方が一致していることを確認してください。

Unicode ビルドでは、醜い TCHAR マクロは次のようになります。

LPTSTR      --> wchar_t*
_tcscpy_s   --> wcscpy_s
_T("Test")  --> L"Test"

だからあなたは持っています:

STDAPI_(void) GetMethodVersion(wchar_t* out_strMethodVersion, 
                               int in_intSize)
{
    ...
    wcscpy_s(out_strMethodVersion, 12, L"Test");
}

「マジックナンバー」 12は正しいですか?が指す宛先文字列バッファーout_strMethodVersionのサイズは少なくとも 12wchar_t秒 (終端の NUL を含む) ですか?

次に、呼び出しサイト(表示されていません) を見てください。

返された文字列をどのように出力しますか? おそらく、ANSI char 関数を使用しているため、返された文字列が ANSI 文字列として誤っchar*て解釈され、Unicode UTF-16 文字列の最初の0x00バイトが呼び出しサイトで NUL ターミネータとして誤って解釈され、文字列が次の場所で切り捨てられます。印刷されたときの最初の文字?

 Text:             T       e       s       t      NUL
 UTF-16 bytes:   54 00   65 00   73 00   74 00   00 00
     (hex)          **<--+
                         |
                 First 00 byte misinterpreted as 
               NUL terminator in char* ANSI string,
         so only 'T' (the first character) gets printed.

編集

コメントで次のことを明確にしたという事実:

私は DLL を ANSI に切り替えました。EXE も明らかにそれでしたが、exe は Unicode として文書化されていました。

EXEはUTF-8 Unicodeエンコーディングを想定していると思います。

ANSI 文字列と同様に、UTF-8 のバイトは文字列 NUL ターミネータであるため、文字列 NUL ターミネータとして誤っ0x00て解釈されたUTF-160x00バイト ( 内wchar_t)の以前の分析が適用されます。

純粋な ASCII は UTF-8 の適切なサブセットであることに注意してください。そのため、純粋な ASCII 文字 ( など"Test") を使用して EXE に渡すだけで、コードが機能する可能性があります。

ただし、EXE が Unicode UTF-8 を使用していることが文書化されている場合は、正しいことを実行して DLL から UTF-8 文字列を返すことをお勧めします。

文字列は (ANSI 文字列の場合と同様に) 経由​​で返されますが、将来の微妙なバグを回避するために、DLL がその文字列を返すために使用するエンコーディングがUTF-8char*であることを確認することが重要です。

Windows API と Visual Studio で使用される一般的な用語は"Unicode"ですが、実際にはこれらのコンテキストでのUTF-16 Unicode エンコーディングを意味します。

ただし、利用可能な Unicode エンコーディングは UTF-16 だけではありません。たとえば、インターネットでテキストを交換するには、UTF-8エンコーディングが広く使用されています。あなたの場合、EXE は Unicode UTF-8 文字列を期待しているようです。

于 2016-02-23T12:20:42.197 に答える
0

遅~#define UNICODE#include "stdafx.h"です。#includeそれ自体は、最初のものよりも前に定義する必要がありstdafx.hます。ただし、適切な方法は、プロジェクトのプロパティで設定することです (メニュー [プロジェクト] > [プロパティ] > [構成プロパティ] > [一般] > [文字セット] > [Unicode 文字セットを使用])。

于 2016-02-23T11:59:01.267 に答える