From: Hoegerl, D. <dan...@et...> - 2011-07-21 07:08:16
|
Hi together, I'm using SWIG to generate a PInvoke wrapper for accessing the C++ DLLs through C# assemblies. Here is my problem: I want to wrap the following C++ method: void CSmallCppDll::getEnumValue(MyEnum &val) I managed to get correct C# PInvoke code. However the *_wrap.cxx file (die C++ wrapper that is then accessed through PInvoke) still generates the following: SWIGEXPORT void SWIGSTDCALL CSharp_CSmallCppDll_getEnumValue(void * jarg1, int & jarg2) { CSmallCppDll *arg1 = (CSmallCppDll *) 0 ; MyEnum *arg2 = 0 ; MyEnum temp2 ; arg1 = (CSmallCppDll *)jarg1; temp2 = (MyEnum)jarg2; arg2 = &temp2; (arg1)->getEnumValue(*arg2); } But I would like to generate the following code for all Enum references: SWIGEXPORT void SWIGSTDCALL CSharp_CSmallCppDll_getEnumValue(void * jarg1, int & jarg2) { CSmallCppDll *arg1 = (CSmallCppDll *) 0 ; MyEnum temp2 ; arg1 = (CSmallCppDll *)jarg1; (arg1)->getEnumValue(temp2); jarg2 = temp2; } Can anyone help me or give me a hint what parts in the enums.swg file influence the generated C++ wrapper code? Many thanks, Daniel |
From: William S F. <ws...@fu...> - 2011-07-28 20:18:02
|
On 21/07/11 08:08, Hoegerl, Daniel wrote: > Hi together, > > I'm using SWIG to generate a PInvoke wrapper for accessing the C++ DLLs through C# assemblies. Here is my problem: > > I want to wrap the following C++ method: > > void CSmallCppDll::getEnumValue(MyEnum&val) > > I managed to get correct C# PInvoke code. However the *_wrap.cxx file (die C++ wrapper that is then accessed through PInvoke) still generates the following: > > SWIGEXPORT void SWIGSTDCALL CSharp_CSmallCppDll_getEnumValue(void * jarg1, int& jarg2) { > CSmallCppDll *arg1 = (CSmallCppDll *) 0 ; > MyEnum *arg2 = 0 ; > MyEnum temp2 ; > > arg1 = (CSmallCppDll *)jarg1; > temp2 = (MyEnum)jarg2; > arg2 =&temp2; > (arg1)->getEnumValue(*arg2); > } > > But I would like to generate the following code for all Enum references: > > SWIGEXPORT void SWIGSTDCALL CSharp_CSmallCppDll_getEnumValue(void * jarg1, int& jarg2) { You can't use C++ references in the api as PInvoke is a C api. > CSmallCppDll *arg1 = (CSmallCppDll *) 0 ; > MyEnum temp2 ; > > arg1 = (CSmallCppDll *)jarg1; > (arg1)->getEnumValue(temp2); > jarg2 = temp2; > } > > Can anyone help me or give me a hint what parts in the enums.swg file influence the generated C++ wrapper code? > There are no non-const enum typemaps (enum SWIGTYPE&) as the calling function may modify the value of the passed in enum and so the default SWIGTYPE & typemaps are used which treat the enum as a pointer and you get a type wrapper class. Try copying the const enum SWIGTYPE & typemaps in enums.swg as enum SWIGTYPE & and modifying to suite. William |
From: Hoegerl, D. <dan...@et...> - 2011-07-28 21:41:51
|
> > Hi together, > > > > I'm using SWIG to generate a PInvoke wrapper for accessing the C++ DLLs through C# assemblies. Here is my problem: > > > > I want to wrap the following C++ method: > > > > void CSmallCppDll::getEnumValue(MyEnum&val) > > > > I managed to get correct C# PInvoke code. However the *_wrap.cxx file (die C++ wrapper that is then accessed through PInvoke) still generates the following: > > > > SWIGEXPORT void SWIGSTDCALL CSharp_CSmallCppDll_getEnumValue(void * jarg1, int& jarg2) { > > CSmallCppDll *arg1 = (CSmallCppDll *) 0 ; > > MyEnum *arg2 = 0 ; > > MyEnum temp2 ; > > > > arg1 = (CSmallCppDll *)jarg1; > > temp2 = (MyEnum)jarg2; > > arg2 =&temp2; > > (arg1)->getEnumValue(*arg2); > > } > > > > But I would like to generate the following code for all Enum references: > > > > SWIGEXPORT void SWIGSTDCALL CSharp_CSmallCppDll_getEnumValue(void * jarg1, int& jarg2) { > > You can't use C++ references in the api as PInvoke is a C api. > > > CSmallCppDll *arg1 = (CSmallCppDll *) 0 ; > > MyEnum temp2 ; > > > > arg1 = (CSmallCppDll *)jarg1; > > (arg1)->getEnumValue(temp2); > > jarg2 = temp2; > > } > > > > Can anyone help me or give me a hint what parts in the enums.swg file influence the generated C++ wrapper code? > > > > There are no non-const enum typemaps (enum SWIGTYPE&) as the calling > function may modify the value of the passed in enum and so the default > SWIGTYPE & typemaps are used which treat the enum as a pointer and you > get a type wrapper class. > > Try copying the const enum SWIGTYPE & typemaps in enums.swg as enum > SWIGTYPE & and modifying to suite. Thanks for the reply. However, that's exactly what I am already trying to do. Unfortunately, I am not very familiar with the syntax and the keywords in the SWIG typemaps, i.e. I do not know what parts of the typemaps are responsible for generating the C api methods and what keywords stand for the actual call and the code before and after the call respectively. Daniel > > William |