10-21-2005 06:18 PM
typedef struct { long dimSizes[2]; LStrHandle String[1]; } TD1; typedef TD1 **TD1Hdl; long __cdecl TestVI(char serialNumber[], TD1Hdl *formattedMeasurements, char ErrorDescription[], long len);The "TestVI" VI generates a 2D array of strings. The cell contents and number of rows are random to simulate different measurement names and measurements.
class CArgoTestsLabVIEW { public: CArgoTestsLabVIEW(); virtual ~CArgoTestsLabVIEW(); // test modules called from parent DLL BOOL GetResult_LV(CString resultName, double *result); long TestVI_LV(CString serialNumber); private: TD1Hdl m_LVStringArray; CMapStringToString m_resultMap; InitMeasurementsArray(); PopulateResultMap(); }
long CArgoTestsLabVIEW::TestVI_LV(CString serialNumber) { long rc = 0; char errStr[BUFFERLEN]; strcpy(errStr,""); rc = InitMeasurementsArray(); if (rc == 0) { rc = TestVI(serialNumber.GetBuffer(serialNumber.GetLength()), &m_LVStringArray, errStr, BUFFERLEN); PopulateResultMap(); } return rc; }The accessor functions InitMeasurementsArray and PopulateResultMap are:
long CArgoTestsLabVIEW::InitMeasurementsArray() { MgErr err; if (m_LVStringArray) { DSDisposeHandle(m_LVStringArray); } m_LVStringArray = (TD1Hdl)DSNewHandle(sizeof(TD1)); // code to check for NULL // Set number of strings in array to 0 (*m_LVStringArray)->dimSizes[0] = 0; (*m_LVStringArray)->dimSizes[1] = 0; // Set total size of array structure. For now it is only as big as the long variable. err = DSSetHandleSize((UHandle)m_LVStringArray, sizeof(long)); // code to check for error return 0; } void CArgoTestsLabVIEW::PopulateResultMap() { int numberOfResults; int i; int charCnt; numberOfResults = (*m_LVStringArray)->dimSizes[0]; if (numberOfResults == 0) { return; } m_resultMap.RemoveAll(); for (i = 0; i < numberOfResults; i++) { charCnt = (*((*m_LVStringArray)->String[i * 2]))->cnt; (*((*m_LVStringArray)->String[i * 2]))->str[charCnt] = '\0'; charCnt = (*((*m_LVStringArray)->String[i * 2 + 1]))->cnt; (*((*m_LVStringArray)->String[i * 2 + 1]))->str[charCnt] = '\0'; m_resultMap.SetAt((LPCTSTR) (*((*m_LVStringArray)->String[i * 2]))->str, (LPCTSTR) (*((*m_LVStringArray)->String[i * 2 + 1]))->str); } }The problem I have is that I eventually get an access violation from the run-time engine if I try to call the test VI in a loop. I'm obviously having a memory management problem, but it escapes me as to where the problem is. Anybody have any ideas?
03-03-2006 01:56 AM - edited 03-03-2006 01:56 AM
smercurio_fc wrote:
The problem I have is that I eventually get an access violation from the run-time engine if I try to call the test VI in a loop. I'm obviously having a memory management problem, but it escapes me as to where the problem is. Anybody have any ideas?
...(*((*m_LVStringArray)->String[i * 2]))->str[charCnt] = '\0';
Message Edited by Dynamik on 03-03-2006 02:03 AM