1. DirectDrawCreate/SetCooperativeMode problems
- Posted by animeshk at yahoo.com Apr 12, 2003
- 547 views
I tried using EuCOM & TBrowser to create a wrapper for dx7vb.dll. My first attempt to use this failed: I used create_com_object to create the DirectX7 object, but when I tried to use call_interface to call the DirectX7 objects "DirectDrawCreate" method. This didn't work: the VB docs show that the "DirectDrawCreate" method is supposed to return a DirectDraw object, but call_interface only returns an HResult. Okay. Next attempt! This time, I followed what the EuCOM Direct3d demo did. I opened the "ddraw.dll" .dll. I used the following to define the DirectDrawCreate fcn: ddrawc = define_c_func(ddrawdll, "DirectDrawCreate", {C_POINTER, C_POINTER, C_POINTER}, C_UINT ) to define the fcn. First param is a ptr to a GUID, in my case null. The second is where they will return the pointer to the DirectDraw object. The third is that "unknown" param, also always set to null. To call this, I defined a ddraw_ptr object, and I used acquire_mem to initialize it. I called the fcn with res = c_func( ddrawc, {NULL, ddraw_ptr, NULL}) Afterwards, I initialized the ddraw object by doing a peek4u on the ddraw_ptr. Finally, I called ref_com_object: ddraw = ref_com_object( DirectDraw7_clsid_ix, ddraw ) So far, so good. Problem is when I call SetCooperativeLevel: res = call_interface( ddraw, DirectDraw7_disp, DirectDraw7_SetCooperativeLevel, { getHandle(MainWin), DDSCL_NORMAL } ) Now, I keep getting a return value of 2147500034, which is the error code DIERR_NOAGGREGATION. I think this means that it thinks, in the call to DirectDrawCreate, I didn't set the third param to null . . . but I did. Has anyone else seen this? Does anyone have a solution for this? Thanks! --Animesh
2. Re: DirectDrawCreate/SetCooperativeMode problems
- Posted by stabmaster_ at hotmail.com Apr 12, 2003
- 558 views
>Now, I keep getting a return value of 2147500034, >which is the error code DIERR_NOAGGREGATION. I think >this means that it thinks, in the call to >DirectDrawCreate, I didn't set the third param to null >. . . but I did. You sure about that? It seems unlikely that you would get a DirectInput error when calling a DirectDraw interface method. Judging from the MSDN page for IDirectDraw7::SetCooperativeLevel, these are the possible error codes: DDERR_EXCLUSIVEMODEALREADYSET DDERR_HWNDALREADYSET DDERR_HWNDSUBCLASSED DDERR_INVALIDOBJECT DDERR_INVALIDPARAMS DDERR_OUTOFMEMORY
3. DirectDrawCreate/SetCooperativeMode problems
- Posted by animeshk at yahoo.com Apr 13, 2003
- 552 views
I just tried this again, this time not using the wrapper generated from TBrowse (importing dx7vb.dll). It still isn't working, and it is returning the same error code at the SetCooperativeMode call. The error code translates, in the TBrowse-generated wrapper, to the completely incorrect error code saying that aggregation isn't allowed! Can anyone tell me what the heck is going on here? I'm sure I'm just doing something really really stupid and obvious (FYI, I figure I could create a simple C or Delphi wrapper DLL, but I really want to be able to access this purely through Euphoria). Here is the code: without warning include win32lib.ew include eucom.ew with warning with trace constant ddrawdll = open_dll("ddraw.dll"), ddrawc = define_c_func( ddrawdll, "DirectDrawCreate", {C_POINTER, C_POINTER, C_POINTER}, C_UINT ), DirectDraw_classid = "D7B70EE0-4340-11CF-B063-0020AFC2CD35", DirectDraw4_iid = "9c59509a-39bd-11d1-8c4a-00c04fd930,0xc5", DirectDraw_classid_ix = add_clsid(DirectDraw_classid), DirectDraw4_disp = add_iid(DirectDraw_classid_ix, DirectDraw4_iid), DirectDraw4_QueryInterface = 0, DirectDraw4_AddRef = 1, DirectDraw4_Release = 2, DirectDraw4_Compact = 3, DirectDraw4_CreateClipper = 4, DirectDraw4_CreatePalette = 5, DirectDraw4_CreateSurface = 6, DirectDraw4_DuplicateSurface = 7, DirectDraw4_EnumDisplayModes = 8, DirectDraw4_EnumSurfaces = 9, DirectDraw4_FlipToGDISurface = 10, DirectDraw4_GetCaps = 11, DirectDraw4_GetDisplayMode = 12, DirectDraw4_GetFourCCCodes = 13, DirectDraw4_GetGDISurface = 14, DirectDraw4_GetMonitorFrequency = 15, DirectDraw4_GetScanLine = 16, DirectDraw4_GetVerticalBlankStatus = 17, DirectDraw4_Initialize = 18, DirectDraw4_RestoreDisplayMode = 19, DirectDraw4_SetCooperativeLevel = 20, DirectDraw4_SetDisplayMode = 21, DirectDraw4_WaitForVerticalBlank = 22, DirectDraw4_GetAvailableVidMem = 23, DirectDraw4_GetSurfaceFromDC = 24, DirectDraw4_RestoreAllSurfaces = 25, DirectDraw4_TestCooperativeLevel = 26, DirectDraw4_GetDeviceIdentifier = 27 atom res function CreateDirectDraw() atom ddraw_ptr atom ddraw_obj ddraw_ptr = acquire_mem(0, 4) res = c_func( ddrawc, {NULL, ddraw_ptr, NULL}) if res then res = message_box( "Couldn't initialize DirectDraw", "Error", 0) release_mem(ddraw_ptr) release_com() abort(1) end if ddraw_obj = peek4u(ddraw_ptr) release_mem(ddraw_ptr) return ref_com_object(DirectDraw_classid_ix, ddraw_obj) end function constant MainWin = create( Window, "DirectDraw Test", 0, 20, 20, 400, 400, 0), DDraw = CreateDirectDraw() res = call_interface( DDraw, DirectDraw4_disp, DirectDraw4_SetCooperativeLevel, { getHandle(MainWin), 0 } ) trace(1) if res then res = message_box ( "Couldn't set cooperative level for DirectDraw", "Error", 0) end if WinMain(MainWin, Normal) release_com() Thanks!
4. Re: DirectDrawCreate/SetCooperativeMode problems
- Posted by stabmaster_ at hotmail.com Apr 14, 2003
- 563 views
After doing some snooping around, i came to the conclusion that the returned value stands for E_NOINTERFACE (or "No such interface"). There might be some problems with the values you give add_iid().. You might want to try calling the interface directly with call_interface_ptr, i didn't quite figure out how that works so it just crashed when i tried it.