diff --git a/common/CallBack.cpp b/common/CallBack.cpp index 0ebc37c..7afe8e0 100644 --- a/common/CallBack.cpp +++ b/common/CallBack.cpp @@ -20,13 +20,10 @@ size_t CallBack::Call(void* params){ SysFreeString(var[0].bstrVal); - VARTYPE type = VT_UI4; + VARTYPE type = (sizeof(size_t) > sizeof(DWORD))? VT_UI8 : VT_UI4; HRESULT hr = VariantChangeType(&result, &result, 0, type); - DWORD dwResult = 0; - dwResult = result.uintVal; - - return dwResult; + return (sizeof(size_t) > sizeof(DWORD)) ? result.llVal : result.lVal; } CallBack::~CallBack(){ diff --git a/common/CallBack.h b/common/CallBack.h index 12705e0..6a67af2 100644 --- a/common/CallBack.h +++ b/common/CallBack.h @@ -28,7 +28,7 @@ class CallBack :public CComDispatch CBP* Proc(); template - static size_t WINAPI CallBackProc(size_t r1, size_t r2,size_t r3,size_t r4,size_t stack1){ + static size_t WINAPI CallBackProc(size_t r1, ...){ #ifndef _M_X64 void* v_ebp = &r1; // base pointer, points to actual parameters of called callback function @@ -56,6 +56,9 @@ class CallBack :public CComDispatch return 0; #else + va_list vars; // enforce the compiler to store + va_start(vars, r1); // integer registers on stack + void* v_ebp = &r1; // base pointer, points to actual parameters of called callback function CallBack* cb = *GetCallBack(NUM); diff --git a/jN.sln b/jN.sln index 4b81a7e..d61f2d9 100644 --- a/jN.sln +++ b/jN.sln @@ -6,6 +6,9 @@ MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jN", "jN.vcxproj", "{1590D7CD-7D3A-4AB7-A355-EE02F7FB987D}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tests", "tests\tests.vcxproj", "{255FBEA7-0EEB-432C-A4DB-B88C9D0572F4}" + ProjectSection(ProjectDependencies) = postProject + {1590D7CD-7D3A-4AB7-A355-EE02F7FB987D} = {1590D7CD-7D3A-4AB7-A355-EE02F7FB987D} + EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -27,10 +30,10 @@ Global {255FBEA7-0EEB-432C-A4DB-B88C9D0572F4}.Debug|Win32.Build.0 = Debug|Win32 {255FBEA7-0EEB-432C-A4DB-B88C9D0572F4}.Debug|x64.ActiveCfg = Debug|x64 {255FBEA7-0EEB-432C-A4DB-B88C9D0572F4}.Debug|x64.Build.0 = Debug|x64 - {255FBEA7-0EEB-432C-A4DB-B88C9D0572F4}.Release|Win32.ActiveCfg = Debug|Win32 - {255FBEA7-0EEB-432C-A4DB-B88C9D0572F4}.Release|Win32.Build.0 = Debug|Win32 - {255FBEA7-0EEB-432C-A4DB-B88C9D0572F4}.Release|x64.ActiveCfg = Debug|x64 - {255FBEA7-0EEB-432C-A4DB-B88C9D0572F4}.Release|x64.Build.0 = Debug|x64 + {255FBEA7-0EEB-432C-A4DB-B88C9D0572F4}.Release|Win32.ActiveCfg = Release|Win32 + {255FBEA7-0EEB-432C-A4DB-B88C9D0572F4}.Release|Win32.Build.0 = Release|Win32 + {255FBEA7-0EEB-432C-A4DB-B88C9D0572F4}.Release|x64.ActiveCfg = Release|x64 + {255FBEA7-0EEB-432C-A4DB-B88C9D0572F4}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/jN.vcxproj b/jN.vcxproj index 36961a5..154ba25 100644 --- a/jN.vcxproj +++ b/jN.vcxproj @@ -74,7 +74,7 @@ true .\;%(AdditionalIncludeDirectories) WIN32;_WINDOWS;_USRDLL;NPPPLUGINTEMPLATE_EXPORTS;UNICODE;%(PreprocessorDefinitions) - MultiThreaded + MultiThreadedDLL false Level3 @@ -112,7 +112,7 @@ true .\;%(AdditionalIncludeDirectories) WIN32;_WINDOWS;_USRDLL;NPPPLUGINTEMPLATE_EXPORTS;UNICODE;%(PreprocessorDefinitions) - MultiThreaded + MultiThreadedDLL false @@ -149,9 +149,8 @@ Disabled .\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;NPPPLUGINTEMPLATE_EXPORTS;UNICODE;%(PreprocessorDefinitions) - false Default - MultiThreadedDebug + MultiThreadedDebugDLL Level3 @@ -185,9 +184,8 @@ Disabled .\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;NPPPLUGINTEMPLATE_EXPORTS;UNICODE;%(PreprocessorDefinitions) - false Default - MultiThreadedDebug + MultiThreadedDebugDLL diff --git a/tests/CallBackTests.cpp b/tests/CallBackTests.cpp index c080f71..bc80ef7 100644 --- a/tests/CallBackTests.cpp +++ b/tests/CallBackTests.cpp @@ -54,8 +54,11 @@ class TestCfg : public IDispatchEx{ virtual HRESULT __stdcall InvokeEx(DISPID id, LCID lcid, WORD wFlags, DISPPARAMS* pdp, VARIANT* pvarRes, EXCEPINFO* pei, IServiceProvider* pspCaller) override { Stack = pdp->rgvarg[1].bstrVal; - pvarRes->uintVal = Result; + + pvarRes->vt = VT_UI4; + pvarRes->lVal = Result; + return S_OK; } virtual HRESULT __stdcall DeleteMemberByName(BSTR bstrName, DWORD grfdex) override @@ -106,7 +109,10 @@ TEST(CallBackTests, With_parameter_has_corresponding_stack_len_and_result) { EXPECT_EQ(SysStringByteLen(cfg.Stack), 2*(sizeof(size_t))); EXPECT_EQ(result, cfg.Result); - EXPECT_EQ((int)(((size_t*)cfg.Stack)[0]), 123); - EXPECT_EQ((int)(((size_t*)cfg.Stack)[1]), 456); + + auto stack = (size_t*)cfg.Stack; + + EXPECT_EQ(*(int*)stack, 123); + EXPECT_EQ(*(int*)(stack+1), 456); } } \ No newline at end of file diff --git a/tests/tests.vcxproj b/tests/tests.vcxproj index c25182d..60be12c 100644 --- a/tests/tests.vcxproj +++ b/tests/tests.vcxproj @@ -34,10 +34,6 @@ - - - true - @@ -56,7 +52,7 @@ NotUsing pch.h Disabled - EnableFastChecks + Default MultiThreadedDebugDLL MultiThreadedDLL Level3 @@ -64,7 +60,8 @@ true Console - shlwapi.lib;%(AdditionalDependencies) + $(MSBuildProjectDirectory)\..\$(Configuration)\*.obj;shlwapi.lib;%(AdditionalDependencies) + $(MSBuildProjectDirectory)\..\x64\$(Configuration)\*.obj;shlwapi.lib;%(AdditionalDependencies) diff --git a/tests/tests.vcxproj.filters b/tests/tests.vcxproj.filters deleted file mode 100644 index d41a8bf..0000000 --- a/tests/tests.vcxproj.filters +++ /dev/null @@ -1,22 +0,0 @@ - - - - - src - - - - - - - - - {b6ea7bd8-17f7-4f1e-9f19-cadd62215743} - - - - - src - - - \ No newline at end of file