There are a few issues in your code snippet that are not right but are not the cause of the problem.
First, you are calling AllocSysString on a CString object which generates a BSTR but which is never freed by anyone. This leaves you with memory leaks. The put_ methods expect a [in] BSTR which means the caller is the owner and should free it.
Second, passing L"string" where the function expects a BSTR is simply incorrect and while it may work in practice at times, it will also fail on some other occassions. You should similarly allocate a BSTR, but remember to free it later. To get rid of these two problems, you might want to use something like put_Filename (CComBSTR (strFilePath)). This will automatically convert to BSTR and free it after the call returns.
Also, using some form of smart pointers (_com_ptr_t, CComPtr, CComQIPtr) would greatly increase readability and decrease interface reference counting problems. Same for BSTRs (CComBSTR, _bstr_t).
As for the cause of crash, it is hard to tell just from the code snippet you sent. It doesn’t appear to be incorrect at first sight but many things could be wrong in the code you did not send.
It would be best if you could send all relevant portions of the code or even better, create a very simple project that reproduces the problem.