将 LPBYTE 更改为 Win DLL 中的 unsigned char* 到 Linux SO 转换后的 C++ 编译器错误

C++ Compiler errors after changing LPBYTE to unsigned char* in Win DLL to Linux SO conversion

我正在努力将 Windows DLL 转换为 Linux SO。我已将所有 BYTE 类型转换为 unsigned char,将 LPBYTE 类型转换为 unsigned char*。

编译器在一个函数中给我如下错误:

Error: Invalid Conversion from 'char*' to 'unsigned char'

Error: Invalid Conversion from 'unsigned char' to 'unsigned char*'

具体在这两行:

if (DataLineIndexOverlap){
    OverlapSize = m_NrofDataLines*m_PosPerSector*m_PosPerSector;
    MirrorDataLineIndexOverlap = new unsigned char[OverlapSize];
}

OverlapSize 被定义为一个 int,MirrorDataLineIndexOverlap 在原始 Windows 代码中是一个 LPBYTE,现在是一个 unsigned char*,新的 unsigned char[OverlapSize] 在原始 [=] 中是新的 BYTE[OverlapSize] 26=]代码。之后还有其他错误,它们都与 MirrorDataLineIndexOverlap 有关,所以我假设初始无效转换错误是根本原因。

我正在寻找最简洁的方法来解决此编译器错误和其他类似错误,同时又不会破坏其余代码。 Linux C++ 中是否有 LPBYTE 的干净替代品,可以编译而不会出现我看到的错误?

完整功能如下:

int CABC_DecodeCode::MirrorCheck(unsigned char* DataLineIndex, bool bThickLines, unsigned char* DataLineIndexOverlap, double *pSecondBestOverlapSum, unsigned int *pResultFlags)
{
    int i, OverlapSize, NoMirrorDataLineSum, MirrorDataLineSum;
    unsigned char* MirrorDataLineIndex, MirrorDataLineIndexOverlap;
    double *pNoMirrorSecondBestOverlapSum, *pMirrorSecondBestOverlapSum;

    MirrorDataLineIndex            = NULL;
    MirrorDataLineIndexOverlap     = NULL;

    NoMirrorDataLineSum            = 0;
    MirrorDataLineSum              = 0;

    if (pSecondBestOverlapSum)
    {
        pNoMirrorSecondBestOverlapSum   = new double;
        pMirrorSecondBestOverlapSum     = new double;

        *pNoMirrorSecondBestOverlapSum  = 0.0;
        *pMirrorSecondBestOverlapSum    = 0.0;
    }

    // normal decode
    for (i=0; i<m_NrofDataLines; i++)
        DataLineIndex[i] = GetDataLineIndex(i, bThickLines, DataLineIndexOverlap, pNoMirrorSecondBestOverlapSum, &NoMirrorDataLineSum);

    FlipCode();

    // flipped image decode
    MirrorDataLineIndex            = new unsigned char[m_NrofDataLines];

    if (DataLineIndexOverlap)
    {
        OverlapSize = m_NrofDataLines*m_PosPerSector*m_PosPerSector;
        MirrorDataLineIndexOverlap  = new unsigned char[OverlapSize];

    }

    for (i=0; i<m_NrofDataLines; i++)
        MirrorDataLineIndex[i] = GetDataLineIndex(i, bThickLines, MirrorDataLineIndexOverlap, pMirrorSecondBestOverlapSum, &MirrorDataLineSum);


    if (MirrorDataLineSum < NoMirrorDataLineSum)
    {
        if (pResultFlags)
            *pResultFlags |= RF_MIRRORRED_CODE;

        memcpy(DataLineIndex, MirrorDataLineIndex, m_NrofDataLines);

        if (DataLineIndexOverlap)
            memcpy(DataLineIndexOverlap, MirrorDataLineIndexOverlap, OverlapSize);

        if (pSecondBestOverlapSum)
            *pSecondBestOverlapSum = *pMirrorSecondBestOverlapSum;
    }
    else
    {
        FlipCode();

        if (pResultFlags)
            *pResultFlags &= ~RF_MIRRORRED_CODE;

        if (pSecondBestOverlapSum)
            *pSecondBestOverlapSum = *pNoMirrorSecondBestOverlapSum;
    }

    delete [] MirrorDataLineIndex;

    if (MirrorDataLineIndexOverlap)
        delete [] MirrorDataLineIndexOverlap;

    if (pMirrorSecondBestOverlapSum)
        delete pMirrorSecondBestOverlapSum;

    if (pNoMirrorSecondBestOverlapSum)
        delete pNoMirrorSecondBestOverlapSum;

    return 1;
}

这一行

unsigned char* MirrorDataLineIndex, MirrorDataLineIndexOverlap;

相当于

unsigned char *MirrorDataLineIndex;
unsigned char MirrorDataLineIndexOverlap;

也许不是故意的。

您可以考虑使用

typedef unsigned char BYTE;
typedef BYTE *LPBYTE;
unsigned char* MirrorDataLineIndex, MirrorDataLineIndexOverlap;

这声明 MirrorDataLineIndex 是一个 unsigned char * 并且 MirrorDataLineIndexOverlap 是一个 unsigned char。替换为:

unsigned char *MirrorDataLineIndex, *MirrorDataLineIndexOverlap;