See the question and my original answer on StackOverflow

This is just regular COM, you can read the documentation on File-based Implementation, it explains how it works. Here is some sample code:

int main()
{
    CoInitialize(NULL);
    {
        LSN lsn = {};
        
        // write
        ILog* log = NULL;
        if (SUCCEEDED(CoCreateInstance(CLSID_SimpleFileBasedLog, NULL, CLSCTX_ALL, IID_PPV_ARGS(&log))))
        {
            IFileBasedLogInit* init = NULL;
            if (SUCCEEDED(log->QueryInterface(IID_PPV_ARGS(&init))))
            {
                if (SUCCEEDED(init->InitNew(L"c:\\temp\\test.txlog", 0)))
                {
                    BLOB blob = {};
                    if (SUCCEEDED(log->AppendRecord(&blob, 1, TRUE, &lsn)))
                    {
                        wprintf(L"write success\n");
                    }
                }
                init->Release();
            }
        }
        log->Release();

        // open 
        if (SUCCEEDED(CoCreateInstance(CLSID_SimpleFileBasedLog, NULL, CLSCTX_ALL, IID_PPV_ARGS(&log))))
        {
            IPersistFile* file = NULL;
            if (SUCCEEDED(log->QueryInterface(IID_PPV_ARGS(&file))))
            {
                if (SUCCEEDED(file->Load(L"c:\\temp\\test.txlog", 0)))
                {
                    BYTE* bytes;
                    ULONG size;
                    if (SUCCEEDED(log->ReadRecord(lsn, NULL, NULL, &bytes, &size)))
                    {
                        wprintf(L"read success\n");
                    }
                }
                file->Release();
            }
        }
    }
    CoUninitialize();
    return 0;
}