Tuesday, May 10, 2011

Unforgettable moments at PTC - II

And here is my last day and my last blog from the desktop of this company :). As compare to yesterday I am pretty relaxed today.
Completing few HR and finance formalities.
Will surely miss my PTC colleagues.
Lets see what new company has got for me.

Monday, May 9, 2011

Unforgettable moments at PTC - I

Its my second last day at PTC. After few hours I will leave for my flat and will come back again tomorrow which will be my last day. My heart beat has increased, I am shivering, feeling heat, thinking a lot and thats just because tomorrow is my last day.

I have enjoyed my last 3years at PTC. I started as a fresher. Its so unlike that I have done a Bsc(PCM) and end up doing a job in a Product base Company and that too in C/C++. I think it was my perseverance which landed me here.

Thanks a lot to my manager Amit Chordia. Such a cool guy. He has been a true mentor to me.

Monday, May 2, 2011

Export/Import a static variable

I faced a scenario in which I required to export/import (from/to a DLL) a structure pointer variable declared as NULL in a .cxx file.

static Notify_struct *ptr_name = NULL;

Now since it a .cxx file I can't use my Export/Import API, because in-case this file is read undet dllimport it will report compilation error as 'definition of dllimport not allowed'.
So, I moved declared this variable to a header file like this:

extern DLLEXPORTIMPORTAPI Notify_struct *ptr_name ;

This made the DLL to export this variable easily.
Few points to make. I cannot write in the header file:

EXPORTIMPORTAPI static Notification_db *notification_db;

as it reports ‘error C2201: must have external linkage’.

Thursday, April 28, 2011

Export/Import template class

I am thankful to this really nice article which helped me to resolve issues to export/import template class instance.
I surfed a lot and couldn't found a way to export/import the whole template class. Instead we need to do explicit template instantiations to achieve this.

For e.g. instead of whole class you do it like this:
template class DLLEXPORTIMPORTAPI Container < int >;

//DLLEXPORTIMPORTAPI is __declspec(dllexport) or __declspec(dllimport)

Wednesday, April 20, 2011

New Findings While DLLization

I faced a problem where the address of a structure (as a void pointer) is passed from one DLL 'A' to 'B'. Idea is that you store these void pointers to DLL 'B' and call them latter on the basis of some assigned keys. This structure contains data variables and some others functions/structure address too.
So, while fetching the address back from DLL 'B' rest of address pointed by the structure gets corrupted.
So, the questions arises are:
1) Shall we do a deep copy and pass structure instead of pointers.
2) Is passing pointers across DLL's is acceptable?

While looking for the solution I came across this interesting article from IBM. http://publib.boulder.ibm.com/infocenter/zvm/v5r3/index.jsp?topic=/com.ibm.zvm.v53.dmsa3/hdcode.htm.
Below are few highlights of this article:
1) A source file that contains a function call through a pointer that may point to either a function or function descriptor must be compiled as non-DLL code.
2) A source file that calls imported functions or imported variables by name must be compiled as DLL code.
3) A source file that contains a comparison of function pointers that may be DLL function pointers must be compiled as DLL code.
4) A source file that may pass a function pointer to DLL code through a parameter or a return value must be compiled as DLL code.

Aisha_Record_Final.wmv

Monday, June 21, 2010

Try DLL'ze your Legacy code

DLL's are awesome, why to update your whole code for a simple change, just update DLL's. Get DLL's and get your build time down just like a squeezed lemon :) . But have you ever tried getting DLL's for the executable containing nearly 150 libraries and you are handling the legacy code running from last 20-25 years?
Making DLL's of smaller number of libraries are easier but the time consumption in the process of creation if you get into more and more libraries.
Common errors which you may face while creating the DLL:
1) While Linking: Unresolved symbols. To resolve check your link line, you probably have not included the required library.
2) Circular dependency tree: This is most annoying and requires a bit of hard work. Either the dll you are creating is itself is the dependency of a library (of a DLL) that you have included or that library depends on some other which interns depends to it.
3) Linking error, symbol already in libcpmt.dll (static) and msvcrt*.dll (dynamic) both. In such cases check your objects, some of them would have got build with MT flag. Convert them to MD and linking will get succeed.