从另一个项目阅读json文件时出现“内存访问无效”

dhxwm5r4  于 2023-03-20  发布在  其他
关注(0)|答案(1)|浏览(111)

我有一个C++中的dll,用于智能卡的行为。我写了一个JSON文件,用于接收数据和响应所需的响应。它看起来像这样:

{
    "00xxxxxx" : ["aaaaaaaaaaaaaaaaa", {
        "00yyyyyyyyyy" : ["bbbbbbbbbbbbbbbb", {
            "00zzzzzzzzz" : ["9000", {}]
        }]
    }]
}

我的CommandHandler.cpp文件接收来自另一个应用程序的命令。它看起来如下:

string CommandHandler::sendCommand(string command)
{
    data = data[command];
    string response;    
   
    if(data == nullptr){
       response = "6700";
       return response;
    }
    response = data[0];
    data = data[1]; 

    return response;
}

CommandHandler::CommandHandler(){} //Empty constructor

 
CommandHandler::CommandHandler(string jsonCommandsPath)
{
    std::ifstream f(jsonCommandsPath);
    data = json::parse(f);
}
string CommandHandler::getJsonFile(){
    jsonCommandsPath = "MyPath";
    return jsonCommandsPath;
}

最后,我调用另一个名为FakeTransmitter.cpp的类中的CommandHandler构造函数:

CommandHandler command;
NOT_EXPORTED CommandHandler commandHandler(command.getJsonFile());

EXPORTED LONG CardTransmit(CARDHANDLE hCard,
                    LPCBYTE pbSendBuffer, DWORD cbSendLength,
                    /*@out@*/ LPBYTE pbRecvBuffer, PDWORD pcbRecvLength) {
                        string command = Conversion::ByteArrayToHexStr(pbSendBuffer, cbSendLength);
                        
                        string response = commandHandler.sendCommand(command);
                        //here I wrote response code, it works correctly.
                        return 5; 
                    }

我用CMake构建了这个项目,并在另一个项目中使用dll进行假响应。然而,在第一次调用它工作的命令时,在我调用相同的命令后,它返回“6700”,这意味着它返回nullptr。
第二个项目的输出如下所示:

Command: 00xxxxxx
Response: aaaaaaaaaaaaaaaaa
Command: 00yyyyyyyyyy
Response: bbbbbbbbbbbbbbbb
Command: 00zzzzzzzzz
Response: 9000
Command: 00xxxxxx -------> Here I call first command again in the same runtime
Response: 6700

我想,我不能再读那个JSON文件了。当我从第二个项目调用的时候,我怎么能达到同样的命令呢?
我只希望在再次调用相同的命令时显示响应。我期望的输出应该如下所示:

Command: 00xxxxxx
Response: aaaaaaaaaaaaaaaaa
Command: 00yyyyyyyyyy
Response: bbbbbbbbbbbbbbbb
Command: 00zzzzzzzzz
Response: 9000
Command: 00xxxxxx
Response: aaaaaaaaaaaaaaaaa
Command: 00yyyyyyyyyy
Response: bbbbbbbbbbbbbbbb
Command: 00zzzzzzzzz
Response: 9000

我已经在项目中尝试了f.close()和f.open()。也许我用错了它们,但是当我使用它们时,它返回我“无效的内存访问”。有解决这个问题的方法吗?

2uluyalo

2uluyalo1#

因此,在我看来,当您接收到当前JSON结构无法理解的命令时,您似乎希望重用原始JSON结构,因此要做到这一点,您需要首先将原始JSON结构保存在类中

CommandHandler::CommandHandler(string jsonCommandsPath)
{
    std::ifstream f(jsonCommandsPath);
    originalData = json::parse(f);     // save the original data
    data = originalData;               // and start with the original data
}

你需要把originalData添加到你的类中,因为你没有展示那个类,所以我不能告诉你怎么做,但是希望它足够清楚。
然后,当您发现无法理解的命令时,您需要重用原始数据。

string CommandHandler::sendCommand(string command)
{
    data = data[command];
    string response;    
   
    if(data == nullptr){
       data = originalData;         // restore the original data
       return sendCommand(command); // and try again
    }
    response = data[0];
    data = data[1]; 

    return response;
}

我有点猜测,因为你的要求不完全清楚。

相关问题