在c ++中使用缓冲区时的垃圾字符

时间:2013-07-30 10:51:00

标签: c++ arrays file char

我有一个我需要在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.

问题是在文件内部而不是好的内容我会像这样得到垃圾:

enter image description here

注意,这只发生在使用缓冲区的函数中:

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的问题(我使用windows.h加载DLL) - 同样的问题。以下是代码:Getting trash data in char* while using it as buffer in function。请帮忙:(

3 个答案:

答案 0 :(得分:0)

您命名了一个函数

DLL_PingConnection=(TYPE_DLL_PingConnection) dynLib2.GetSymbol(....

并用

调用它
OSOZ.OSOZ_PingConnection(buffor_ping_xml);

你输入一个函数

typedef bool(*TYPE_DLL_PingConnection)(char*); 

你创建一个变量

char buffor_ping_xml[2000];
你的typedef中的

char*而你的buffor_ping_xml是char

怎么办呢?

尝试

char *buffor_ping_xml = new char[2000]; 
/* or */
wchar_t *buffor_ping_xml = new wchar_t[2000];
/* or */
wxChar *buffor_ping_xml = new wxchar[2000];

bool is_ping = DLL_PingConnection(buffor_ping_xml);
wxString mystring = wxString::FromUTF8(buffor_ping_xml);

mystring写入档案。

待办事项:

  • 查看wxwidgets\libs文件夹中的libs文件夹 在libwxmsw29ud_*名称中是否有'u'(在此处的版本号为29之后)? 如果不是您不能使用unicode

如果是,接下来的步骤

  • 针对所有不同的测试char *wchar_t *wxChar *为文件指定不同的名称。
    例如file_ping_xml.Open(wxT(“C:\ dll \ ping_w_t_FromUTF8.xml”),...
    对于wchar_t *与
    组合 wxString mystring = wxString::FromUTF8(buffor_ping_xml);
  • 也与
  • 结合使用
  • wxString mystring(buffor_ping_xml);

  • 然后查看浏览器中文件的外观。

要测试您可以转到您的wxWidgets示例文件夹。在文件夹C:\wxWidgets\samples\docview\docview.cpp中编译。使用docview.exe打开一个unicode文件。它看起来如何。

Unicode download file

与Unicode相关的编辑设置

您应该将wxUSE_UNICODE定义为1以在Unicode模式下编译您的程序。这适用于wxMSW,wxGTK,wxMac和wxX11。如果在ANSI模式下编译程序,仍然可以定义wxUSE_WCHAR_T以获得对wchar_t类型的一些有限支持。

答案 1 :(得分:0)

这个

DLL_PingConnection=(TYPE_DLL_PingConnection)

不应该是

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

否则你将无法获得DLL中函数的有效指针。

作为一般规则,您应该检查返回值,尤其是DLL中的返回值 你动态加载,因为你有时会得到另一个版本 可能具有相同名称但其他签名或函数的DLL的DLL 在哪里完全缺失。

答案 2 :(得分:0)

以下是答案:Getting trash data in char* while using it as buffer in function

谢谢大家 - 特别是耐心。