1

VB6 アプリに次のコードがあります。

Private Declare Function FileGetParentFolder Lib "Z-FileIO.dll" _
(ByVal path As String) As String

Output.AddItem FileGetParentFolder(FileText.Text)

出力はリストで、FileText はファイル パスを含むテキスト フィールドです。私の C++ DLL には次の関数が含まれています。

extern "C" BSTR ZFILEIO_API FileGetParentFolder(Path p)
{
    try {
        return SysAllocString(boost::filesystem::path(p).parent_path().c_str());
    } catch (...) {
        return SysAllocString(L"");
    }
}

Pathtypedef'd as はどこにありますかLPCSTR。引数は完全に私の DLL に入りますが、何を返そうとしても、VB6 アプリはゴミしか表示しません。でいくつかの異なる方法を試し、引数をSysAllocStringByteLengthにキャストし、他のバリアントを作成しました。文字列の最初の文字しか表示されないか、実際の文字列ではなく、ドット付きの Y のみが表示されます。有効な BSTR を作成して C++ から VB6 に渡すための実際の方法を知っている人はいますか?SysAllocStringLPCWSTR

4

2 に答える 2

2

関数シグネチャの使用を主張する場合は、これを含むVB6用のカスタムtypelibを準備する必要があります

[dllname("Z-FileIO.dll")]
module ZFileIO
{
    [entry("FileGetParentFolder")]
    BSTR FileGetParentFolder ([in] LPWSTR path);
};

sでは、 Declareparam-typesAs Stringは自動的にANSI文字列に変換されますLPSTRLPWSTRUnicode文字列(または)を送受信する唯一の方法BSTRは、typelibAPI関数宣言を使用することです。

それ以外As Longは、宣言でいつでもparamsを使用して、sを期待できますが、その場合LPWSTR、コンシューマーはStrPtrAPI関数を呼び出すたびに文字列をラップする必要があります。

于 2011-05-26T08:21:55.353 に答える
2

うまくいけば、これはあなたを正しい方向に向けるでしょう。記憶から…

VB6 は内部で COM BSTR (2 バイト幅の文字列) を使用しますが、外部 DLL と通信する場合は、シングルバイトまたはマルチバイトの文字列を使用します。(おそらく UTF-8 ですが、はっきりとは覚えていません。) LPCSTR への Path typedef は ANSI 文字列であるため、正しく受け取ることができます。生成した戻り値はワイド文字列ですが、VB は ANSI 文字列を想定しています。戻り値を返す前に、WideCharToMultiByte を使用して変換する必要があります。

VB がこの暗黙的な変換を行うのは少し奇妙に思えますが、実際にはそうです。(私が覚えている限りでは。)

于 2011-05-26T07:00:18.857 に答える