Access violation when using IShellFolder2

FreeSlave freeslave93 at gmail.com
Tue Sep 8 22:24:22 UTC 2020


Consider the following code:

import core.sys.windows.windows;
import core.sys.windows.shlobj;
import core.sys.windows.wtypes;

import std.exception;

pragma(lib, "Ole32");

void main()
{
     OleInitialize(null);
     scope(exit) OleUninitialize();
     IShellFolder desktop;
     LPITEMIDLIST pidlRecycleBin;

     enforce(SUCCEEDED(SHGetDesktopFolder(&desktop)), "Failed to 
get desktop shell folder");
     assert(desktop);
     scope(exit) desktop.Release();
     enforce(SUCCEEDED(SHGetSpecialFolderLocation(null, 
CSIDL_BITBUCKET, &pidlRecycleBin)), "Failed to get recycle bin 
location");
     assert(pidlRecycleBin);
     scope(exit) ILFree(pidlRecycleBin);

     IShellFolder2 recycleBin;
     enforce(SUCCEEDED(desktop.BindToObject(pidlRecycleBin, null, 
&IID_IShellFolder2, cast(LPVOID *)&recycleBin)), "Failed to get 
recycle bin shell folder");
     assert(recycleBin);
     scope(exit) recycleBin.Release();

     IEnumIDList enumFiles;
     with(SHCONTF) enforce(SUCCEEDED(recycleBin.EnumObjects(null, 
SHCONTF_FOLDERS | SHCONTF_NONFOLDERS | SHCONTF_INCLUDEHIDDEN, 
&enumFiles)), "Failed to enumerate objects in recycle bin");
     enumFiles.Release();
}

For me this code crashes with error:

object.Error@(0): Access Violation
----------------
0x75B4EBB8 in SHELL32_CLocationContextMenu_Create
0x004023A9
0x0040493B
0x004048B5
0x0040474E
0x00402C9A
0x0040250B
0x75816359 in BaseThreadInitThunk
0x76F07C24 in RtlGetAppContainerNamedObjectPath
0x76F07BF4 in RtlGetAppContainerNamedObjectPath

However if I change the type of recycleBin variable to 
IShellFolder (not IShellFolder2), the crash does not happen.

Does IShellFolder2 require some special handling?


More information about the Digitalmars-d-learn mailing list