After very extensive experimentation, I have learned more about the crash reported below. Basically, any C++ automation - based method that removes all files from the current playlist will eventually cause a crash, sometimes immediately, sometimes when followed by subsequent calls to functions that use the current playlist - adding files, playing, etc.
Background: my code was attempting to replace the current "now playing" list with a different list of files. I coded this, logically, by calling IMJCurPlaylistAutomation::RemoveAllFiles(), then adding files in a loop using AddFileByKey or AddFile, followed by a MJPlaybackAutomation::Play() call. Intermittent crashes, referencing HEAP errors or Invalid Handles, followed.
I tried several different methods of clearing the current playlist. For instance:
pCurPlaylist->RemoveAllFiles();
or:
for ( long i = pCurrentPlaylist->GetNumberFiles() - 1; i >= 0; i-- ) {
pCurrentPlaylist->RemoveFile(i);
}
or:
while (pCurrentPlaylist->GetNumberFiles() > 0 )
pCurrentPlaylist->RemoveFile(0);
All of these techniques eventually led to crashes - both of the above crashed after , at most, a few iterations including subsequent calls to Play or similar.
Here is what worked for me finally (at least, based on 2 hours of diligent testing):
// add the files we want to add FIRST:
long i;
for ( i = 0; i < filesToAdd.size(); i++) {
pCurPlaylist->AddFile(filesToAdd,i);
}
// NOW remove all of the files that existed in the current playlist before:
long j;
for ( j = pCurPlaylist->GetNumberFiles() - 1; j >= i; j-- )
pCurPlaylist->RemoveFile(j);
In other words, as long as you don't remove all of the files from the now playing list using automation - at least, C++ automation - you're fine. At least, my experimentation thus far seems to demonstrate.
This should be tested and filed as a bug by JR folks, and the workaround published somewhere.
And BTW - the workarounds described in the previous post, such as sleeping for a time after adding files, seem to be a red herring - simply delaying the crash. It's quite possible that I've only found another temporarily promising avenue - but I'm hoping for the sake of my project, that this is the final resolution.