Hi folks,
I have a strange problem, seems to be Garbage Collector in managed memory. There is an unmanaged dll which makes a call to my managed dll with giving a structure as a parameter. Managed dll takes this param and sets the values in the struct. when debugging on the managed side, all the values in the struct are meaningfull but when i pas back to unmanaged dll side, some values in the struct became huge or meaningles.
I have played arround marshalling, pinned pointers etc. but when the DVRSET param is passed to unmanaged c++ dll, values of the struct became abnormal...
Thanks for your further help...
Here is the code
structure defined in both sides...
the managed codeCode:struct DVRSET { //Top Values bool DoRender; //Global Switches bool GS_Geo_Displacement; bool GS_Geo_ForceBackFaceCulling; bool GS_Lighting_Lights; bool GS_Lighting_DefaultLights; bool GS_Lighting_HiddenLights; bool GS_Lighting_Shadows; bool GS_Lighting_ShowGIOnly; bool GS_Materials_ReflectionRefraction; bool GS_Materials_MaxDepth; int GS_Materials_MaxDepthValue; bool GS_Materials_Maps; bool GS_Materials_FilterMaps; bool GS_Materials_FilterMapsForGUI; int GS_Materials_MaxTrunspLevel; float GS_Materials_TrunspCutOff; float GS_RayTracing_SecondaryRayBias; bool GS_IndirectIllumination_DontRenderFinalImage; //Environment Settings int ES_BGColorR; int ES_BGColorG; int ES_BGColorB; int ES_ReflectColorR; int ES_ReflectColorG; int ES_ReflectColorB; int ES_RefractColorR; int ES_RefractColorG; int ES_RefractColorB; int ES_GIColorR; int ES_GIColorG; int ES_GIColorB; float ES_BGTexMultiplier; float ES_ReflectTexMultiplier; float ES_RefractTexMultiplier; float ES_GITexMultiplier; //Color Mapping int CM_Type; float CM_DarkMultiplier; float CM_BrightMultiplier; float CM_Gama; float CM_ClampLevel; bool CM_SubPixelMapping; bool CM_ClampOutput; bool CM_AdaptationOnly; //Indirect Illumination (GI) bool GI_On; bool GI_ReflectCaustics; bool GI_RefractCaustics; float GI_Saturation; float GI_Contrast; float GI_ContrastBase; float GI_PrimaryMultiplier; float GI_SecondaryMultiplier; int GI_PrimaryEngine; int GI_SecondaryEngine; //Irradiance Map int IM_MinRate; int IM_MaxRate; int IM_SubDivs; int IM_InterpSamples; int IM_InterpFrames; float IM_ColorThreshold; float IM_NormalThreshold; float IM_DistanceThreshold; bool IM_DetailEnhancement; float IM_DetailRadius; float IM_DetailSubdivsMulti; int IM_DetailScale; int IM_InterpolationMode; int IM_LookupMode; bool IM_Multipass; bool IM_RandomizeSamples; bool IM_CheckSampleVisibility; bool IM_ShowCalcPhase; bool IM_ShowDirectLight; bool IM_ShowSamples; int IM_Mode; //Light Cache int LC_SubDivs; float LC_SampleSize; int LC_FilterType; int LC_FilterSamples; float LC_FilterSize; bool LC_PreFilter; int LC_PreFilterSamples; int LC_Depth; bool LC_ShowCalcPhase; bool LC_StoreDirectLight; bool LC_WorldScale; int LC_Mode; bool LC_UseForGlossyRays; bool LC_AdaptiveSampling; int LC_NumPasses; //Region Size int RG_XC; int RG_YC; //Output Settings int OS_ImageSize; };
unmanaged sideCode:extern "C" { __declspec(dllexport) bool __cdecl SetStruct(DVRSET* settings) { bool retVal = false; DinoVRay::TestForm frm; frm.Settings = settings; if(frm.ShowDialog() == System::Windows::Forms::DialogResult::OK) retVal = true; else retVal = false; settings = frm.Settings; return retVal; } }
Code://.NET DLL Bridge cagiriliyor.... HINSTANCE hBridgeDLL = LoadLibrary("DinoVRay.dll"); FARPROC lpfnGetProcessID = GetProcAddress(HMODULE (hBridgeDLL), "SetStruct"); typedef void (__cdecl * pICFUNC)(DVRSET*); pICFUNC MyFunction; MyFunction = pICFUNC(lpfnGetProcessID); DVRSET vrset; MyFunction(&vrset); //-> Get The Form Ula



LinkBack URL
About LinkBacks



CornedBee
