0
votes

I wrote a C# function of DLL that returns a byte pointer that points to an array of pointers that point to structures. My C# code as below: unsafe public void myCSharpFunc(uint ipaddress, string starttime, string finishtime, ref byte data, ref int count) { byte* bytePointer = stackalloc byte[iCount];

            // get data
            for (int i = 0; i < iCount; i++)
            {
                sElementName = utf8Encoding.GetString(results[i].Column.Name);
                bElementValue = results[i].Column.Value;
                size = (bElementValue.Length);
                elmtPointer = Marshal.AllocHGlobal(size);
                try
                {
                    // copy array to pointer
                    Marshal.Copy(bElementValue, 0, elmtPointer, size);
                    bytePointer[i] = (byte)elmtPointer;
                }catch(Exception ex){
                    Console.WriteLine(("kvs_getTotal() Exception 1 message: " + ex.Message + "; string: " + ex.ToString() +
                "; source: " + ex.Source));
                }
            }

            data = bytePointer[0];
            count = iCount;

}

data is a byte pointer that points to an array of pointers. Each pointer of the array points to a structure.

In C++ DLL, I have the following function: void myCPlusFunc(DWORD ipaddress, BYTE* starttime, BYTE* endtime, BYTE* data, int* count) { byte bData; long iCount = 0L;

//Initialize COM.
HRESULT hr = CoInitialize(NULL);

CString sStTime((char*)starttime);
CString sFnTime((char*)endtime);

IDrvMgr* pDrvMgr = NULL;

hr = CoCreateInstance(__uuidof(CKvsDrvMgr_Total),NULL,CLSCTX_INPROC_SERVER,__uuidof(IDrvMgr),(void**)&pDrvMgr);

pDrvMgr->myCSharpFunc(ipaddress, (LPCWSTR)sStTime, (LPCWSTR)sFnTime, &bData, &iCount);

*count = (int)iCount;
*data = bData;

// 結果の処理
wchar_t strBuf[30];
wsprintf(strBuf,(LPCWSTR)L"*record count =%d",*count);
MessageBox(NULL, (LPCWSTR)strBuf ,(LPCWSTR)L"◇kvs_getTotal() C++ 結果" , MB_OK);

// Uninitialize COM.
CoUninitialize();
return;

}

Then, in C test program like below:

define DATETIME_LEN 14

define TEST_SIZE 5

typedef struct{ DWORD ip; char datetime[DATETIME_LEN+1];
int num; } T_TOTAL;

int main(int argc, char* argv[]) { T_TOTAL tttest[TEST_SIZE] ={ {21539008, "20110712120101", 100}, {21539008, "20110712120102", 200}, {21539008, "20110712120103", 300}, {21539008, "20110712120104", 400}, {21539008, "20110712120105", 500} }; int iCount; BYTE bData;

// insert data
insDataFunc(tttest[0].ip, (BYTE*)tttest[0].datetime, (BYTE*)(&tttest[0]), sizeof(tttest[0]));
insDataFunc(tttest[1].ip, (BYTE*)tttest[1].datetime, (BYTE*)(&tttest[1]), sizeof(tttest[1]));
insDataFunc(tttest[2].ip, (BYTE*)tttest[2].datetime, (BYTE*)(&tttest[2]), sizeof(tttest[2]));
insDataFunc(tttest[3].ip, (BYTE*)tttest[3].datetime, (BYTE*)(&tttest[3]), sizeof(tttest[3]));
insDataFunc(tttest[4].ip, (BYTE*)tttest[4].datetime, (BYTE*)(&tttest[4]), sizeof(tttest[4]));

// search data
myCPlusFunc(tttest[0].ip, (BYTE*)tttest[0].datetime, (BYTE*)tttest[TEST_SIZE-1].datetime, &bData , &iCount);

return 0;

}

After calling the search function (myCPlusFunc() function), I want to check the data returned. Would you please tell me the way to manipulate the byte pointer (&bData) that points to array of pointers that point to structures. I haven't known the way to access the array of pointers that point to structures yet. Any help is highly appreciated!

1

1 Answers

0
votes

I acess like below:

    BYTE* p = &bData;
BYTE* p1 = p;
BYTE* p2 = (BYTE*)p++;
BYTE* p3 = (BYTE*)p++;
T_TOTAL* t1 = (T_TOTAL*)p1;
T_TOTAL* t2 = (T_TOTAL*)p2;
T_TOTAL* t3 = (T_TOTAL*)p3;

but the data of structure t1, t2, t3 is not the same with data used for inserting. Do you have any comment why ?