2012-06-15 2 views
0

Хорошо, поэтому у меня есть этот код, и я передаю его неуправляемой DLL, к которой я знаю только экспорт, и имею некоторый пример кода. Я возвращаю правильную строку, но за ней следуют байты мусора.C++ to VB.Net IntPtr Strings

Я в основном переводю код verbatim из примера программы C++, у которой нет этой проблемы. Я предполагаю, что есть что-то фундаментальное, чего я здесь не вижу, поэтому, если кто-нибудь скажет мне, что это такое, я был бы признателен.

Пример C++ код

void CDUKPT_TESTDlg::OnButton4() 
{ 
    // TODO: Add your control notification handler code here 
    unsigned char dataout[1024],tmp[1024],ksn[20],keyval[20]; 
    int nRet,len; 
    memset(dataout,0,sizeof(dataout)); 
    memset(ksn,0,sizeof(ksn)); 
    memset(keyval,0,sizeof(keyval)); 
    memset(tmp,0,sizeof(tmp)); 
    UpdateData(TRUE); 

    two_one((unsigned char *)m_strCURKSN.GetBuffer(m_strCURKSN.GetLength()),m_strCURKSN.GetLength(),ksn); 
    two_one((unsigned char *)m_strMACK.GetBuffer(m_strMACK.GetLength()),m_strMACK.GetLength(),keyval); 
    two_one((unsigned char *)m_EncryptDat.GetBuffer(m_EncryptDat.GetLength()),m_EncryptDat.GetLength(),dataout); 

    len=m_EncryptDat.GetLength()/2; 
    //extern int __stdcall ExtractDat(unsigned char *input, 
    //unsigned short len,unsigned char *output,unsigned char *key, 
    //unsigned char *ksn); 
    nRet=ExtractDat(dataout,len,tmp,keyval,ksn); //External Call 
    //Good string+bad trailing data comes back in tmp 
    m_Result=tmp; 
    UpdateData(FALSE); 
} 

Этот код выплевывает этот ܉Òdÿo 

Вот мой VB.Net код

Public Function Encrypt(ByVal inp As String) As String 
    Dim tmpSB As New StringBuilder 
    Dim i As Integer 
    Dim tKsn As Char() = TwoOne(StrCurKsn) 
    For i = tKsn.Length To 19 
     tKsn = tKsn + Chr(0) 
    Next 
    Dim tMack As Char() = TwoOne(StrMack) 
    For i = tMack.Length To 19 
     tMack = tMack + Chr(0) 
    Next 
    Dim tEnc As Char() = TwoOne(inp) 
    For i = tEnc.Length To 1023 
     tEnc = tEnc + Chr(0) 
    Next 
    Dim len As Integer = tEnc.Length/2 

    Dim tmpStr(1023) As Char 
    Array.Clear(tmpStr, 0, 1024) 
    Dim tmpPtr = Marshal.StringToHGlobalAnsi(tmpStr) 

    Dim nRet = ExtractDat(tEnc, len, tmpPtr, tMack, tKsn) 

    tmpStr = Marshal.PtrToStringAnsi(tmpPtr) 
    Dim tsl = tmpStr.Length 
    Encrypt = tmpStr 
End Function 

Этот код плюет на это

܉Òdÿo ålUäÙålUäÙålUäÙålUäÙålUäÙålUäÙålUäÙ

Итак, я получаю правильную строку, но за ней следует повторяющаяся строка символов мусора. Я надеюсь, что я сделал что-то явно неправое, но я попытался вытащить данные в виде байтов и символов, а также преобразовать их во множество разных методов, и я не могу избавиться от этих символов ... Кроме того, ExtractDat не возвращает длину строки (не проблема, как это не предполагается, что действительно раздражает).

+0

проверить, что 'm_EncryptDat.GetLength()' и 'tEnc.Length/2' возвращают одно и то же, потому что у меня есть ощущение, что они не являются, хотя это просто догадка. Также эти printf работают одинаково в VB как он работает в C, где он останавливается на «\ 0» или отображает все это с момента своего массива, пытаясь напечатать больше символов в коде C и посмотреть, нет ли каких-либо различий в коде VB. –

+0

Массив заполняется нулевыми байтами в строке C++ после данных, которые я хотел вернуть. –

+0

Оба в конечном итоге являются двумя (m_EncryptDat.GetLength() и tEnc.Length/2) –

ответ

0

Оказывается, dll было плохо, поэтому после того, как я получил новый компилятор от поставщика, он, похоже, сработал.