-1

C++ で処理する必要がある DLL があります。私は WxWidgets (標準のコンパイルですが、Unicode のオン/オフも試しました) と NetBeans を使用しています。私も WxWidgets ( windows.h) なしでこれを処理しようとしましたが、同じ問題がありました。

WxWidgets を使用して DLL 関数にアクセスする方法は次のとおりです。

// -------------------- POINTERS TO FUNCTIONS
typedef bool(*TYPE_DLL_SetLicense)(char*, char*);
typedef bool(*TYPE_DLL_PingConnection)(char*); 
typedef char*(*TYPE_DLL_ERR_DESCRIPTION)(void);

class DLL_Library
{
public:
    // pointers to functions inside dll
    TYPE_DLL_SetLicense DLL_SetLicense;        //initialize - will wor fine as it returns only true/false (buffer only provide data)
    TYPE_DLL_PingConnection DLL_PingConnection;      //ping to serwer. Will return trahs, becouse it uses buffer to provide data ang get answear back
    TYPE_DLL_ERR_DESCRIPTION DLL_ERR_DESCRIPTION;      //error description. No buffer, no trouble. Returns correct string.
    wxDynamicLibrary dynLib2;

    int initialize(void)
    {
        //patch to dll
        wxString path = wxStandardPaths::Get().GetExecutablePath().BeforeLast('\\') + _("\\DLL_dll\\DLLMOK.dll");
        if(!wxFile::Exists(path)) return -1;

        //load dll
        if(!dynLib2.Load(path)) return -2;

        //Assign functions in dll to variable
        DLL_SetLicense=(TYPE_DLL_SetLicense) dynLib2.GetSymbol(wxT("DLL_SetLicense"));
        DLL_PingConnection=(TYPE_DLL_PingConnection)  dynLib2.GetSymbol(wxT("DLL_PingConnection"));
        DLL_ERR_DESCRIPTION=(TYPE_DLL_ERR_DESCRIPTION) dynLib2.GetSymbol(wxT("DLL_ERROR_DESCRIPTION"));


    return 0;
   }
};

そして、これが私が実行する関数です。ファイルに保存しようとしている XML コンテンツが返されます。

//DLL_PingConnection            
//result ping to be save in file
wxFile file_ping_xml;
plik_ping_xml.Open(wxT("C:\\dll\\ping.xml"),wxFile::write);
char buffor_ping_xml[2000];

//I run the function here
bool is_ping = DLL_PingConnection(buffor_ping_xml);

if(is_ping)
{

    tex_box->AppendText(wxT("DLL_PingConnection True\n"));

    //we save result to file
    bool is_write_ping_ok = file_ping_xml.Write(buffor_ping_xml,2000);
    if (is_write_ping_ok){tex_box->AppendText(wxT("Save to file is ok ok\n"));}
    else {tex_box->AppendText(wxT("Save to file failed :( \n"));}                
}
else
{
    tex_box->AppendText(wxT("DLL_PingConnection False\n"));
} 


std::cout << "Error description: " << DLL_ERR_DESCRIPTION() << "\n"; //will work fine both in saving to file, and in streaming to screen.

問題は、良いコンテンツではなく、ファイル内で次のようなゴミが得られることです。

ここに画像の説明を入力

これは、次のようなバッファを使用する関数でのみ発生することに注意してください。

char buffer[2000] //buffer will contain for example file xml
function do_sth_with_xml(buffer) //buffer containing xml will (should) be overwriten with xml results of the function - in our case DLL_PingCONNECTION should save in buffer xml with connection data

ドキュメントによると、DLL は Windows-1250 で動作します。ファイルping.xmlを Windows ANSI に設定しましたが、ここに問題があるとは思いません。

編集:WxWidgetsなしで問題を書きました(を使用してDLLをロードしますwindows.h)-同じ問題。コードは次のとおりです。char* でゴミデータを取得しながら、関数でバッファーとして使用します。助けてください :(

4

3 に答える 3

0

これ

DLL_PingConnection=(TYPE_DLL_PingConnection)

すべきではないか

DLL_PingConnection=(TYPE_DLL_PingConnection) dynLib2.GetSymbol(wxT("DLL_PingConnection"));

?

そうしないと、DLL 内の関数への有効なポインターを取得できないようです。

原則として、特に動的にロードする DLL からの戻り値を確認する必要があります。これは、同じ名前で別の署名を持つ関数や完全に欠落している関数を持つ DLL の別のバージョンを取得することがあるためです。

于 2013-08-02T18:16:40.287 に答える