저는 C#에서 StgCreateStorageEx를 호출하는 방법을 거의 일주일 동안 알아 내려고 노력해 왔으며, AccessViolationException과 두통으로 보여야 만합니다.C#의 StgCreateStorageEx가 AccessViolationException을 제공합니다.
어떻게 함수를 선언해야할지 모르겠습니다. 나는 수많은 웹 사이트가 수천 가지 다른 방식으로 선언 한 것을 보았습니다. 그러나 이것은 내가 현재 가지고있는 것입니다 :
[DllImport("ole32.dll")]
public unsafe static extern UInt32 StgCreateStorageEx([MarshalAs(UnmanagedType.LPWStr)] string
pwcsName, long grfMode, STGFMT stgfmt, uint grfAttrs, IntPtr pStgOptions, IntPtr reserved2, [In] Guid riid, void** ppObjectOpen)
내가 본 사이트 내가 마지막 매개 변수에 MarshalAs를 사용할 필요가 말해, 나는의 IUnknown, 인터페이스, LPStruct, 그리고 몇몇 다른 사람을 사용하여 시도했습니다. 저를 얻은 유일한 이유는 데이터 유형에 대한 마샬 러의 불만 때문이었습니다. 나는 아마 관련이있는 느낌을 얻지 만, 그것이 단지 원하지 않는 것을 말해주기 때문에, 나는 그것이 무엇을 원하는지 전혀 모른다.
어떻게 함수를 호출 할까? 이것은 훨씬 간단하게 시작되었습니다.
IntPtr ptr2ptr2ptr = Marshal.AllocHGlobal(IntPtr.Size);
IntPtr ptr2ptr = Marshal.AllocHGlobal(IntPtr.Size);
IntPtr ptr2data = Marshal.AllocHGlobal(104857600); // pretty sure that's enough for whatever StgCreateStorageEx wants to do.
Marshal.WriteIntPtr(ptr2ptr,ptr2data);
Marshal.WriteIntPtr(ptr2ptr2ptr, ptr2ptr);
Guid IID_IStorage = new Guid("0000000B-0000-0000-C000-000000000046");
UInt32 results;
results = NativeMethods.StgCreateStorageEx(null, NativeMethods.STGM_READWRITE + NativeMethods.STGM_SHARE_EXCLUSIVE,
NativeMethods.STGFMT.STGFMT_STORAGE, 0, IntPtr.Zero, IntPtr.Zero, IID_IStorage, (void**)Marshal.ReadIntPtr(ptr2ptr2ptr).ToPointer());
:하지만 그래서 당신이 엉망이 자신을 메모리를 관리하는 것이었다 메모리 위반을 얻기 후에 나는 읽기 시작하고 결국 유일한 방법은 GC가 나를 이상 속이고하지되었는지를 확인하는 결론에 도달했다 아무도이 엉망진창을 풀고 실제로 작동시키는 방법에 대한 아이디어가 있습니까?
그런데 궁극적 인 목표는 TreeView에서 Windows 탐색기로 폴더를 드래그하여 해당 폴더와 모든 내용을 삭제 한 위치에 쓸 수있게하는 것입니다. catch는 TreeView가 전적으로 데이터베이스에 저장된 파일 시스템을 나타냅니다. 내가 할 수있는 유일한 방법은 IStorage를 전달하는 것이므로 StgCreateStorageEx에 대한 호출이 필요합니다.
당신이 pinvoke.net를 시도? http://pinvoke.net/default.aspx/ole32/StgCreateStorageEx.html에는 사용할 수있는 OLE 구조화 된 저장소 주변에 관리되는 래퍼가 있다고 나와 있습니다. –
그것이 제가 시작한 곳입니다. 내가 말할 수있는 한 System.IO.Packaging은 이미 존재하는 Storages를 사용하는 데 적합하지만 실제로 새 저장소를 만들 수는 없습니다. –