private void ThreadMainEnumDB() { if (m_bVolume) // Enumerate volumes. { Guid guid = new Guid("ffffffffffffffffffffffffffffffff"); int cch = 32; string str = new String('\0', cch); while (Rapi.CeEnumDBVolumes(ref guid, str, cch) == Rapi.RAPI_TRUE && m_bContinue) { strBuffer = str; itReason = INVOKE_ENUMDB.ENUMDB_NEWVOLUME; m_ctlInvokeTarget.Invoke(m_deleCallback); } } else // Enumerate databases. { short cRecords = 0; IntPtr pfdbAll = IntPtr.Zero; Rapi.CeFindAllDatabases(0, Rapi.FAD.FAD_NAME | Rapi.FAD.FAD_NUM_RECORDS, ref cRecords, ref pfdbAll); IntPtr pfdb = pfdbAll; while (cRecords > 0) { // Set pointer to next record. Rapi.CEDB_FIND_DATA dbfd = (Rapi.CEDB_FIND_DATA) Marshal.PtrToStructure( pfdb, typeof(Rapi.CEDB_FIND_DATA)); // Post name to listbox. strBuffer = dbfd.DbInfo.szDbaseName + " (" + dbfd.DbInfo.wNumRecords + " records)"; itReason = INVOKE_ENUMDB.ENUMDB_NEWDATABASE; m_ctlInvokeTarget.Invoke(m_deleCallback); // Get ready for next loop. pfdb = (IntPtr)((int)pfdb + Marshal.SizeOf(dbfd)); cRecords--; } // while // Free memory returned by CeFindAllDatabases. Rapi.CeRapiFreeBuffer(pfdbAll); } // if // Notify main thread that we are done. itReason = INVOKE_ENUMDB.ENUMDB_COMPLETE; m_ctlInvokeTarget.Invoke(m_deleCallback); // Mark thread as done. m_thrd = null; }