You are viewing a plain text version of this content. The canonical link for it is here.
Posted to general@xerces.apache.org by Born Franz <Fr...@blr.spcnl.co.in> on 2000/02/06 17:44:24 UTC

xerces 1.0.1 and VC++5.0, DLL->LIB

When trying to write my own programs with xerces and VC++5.0 I often get an
exception when an object is deleted. Seems that VC++5.0 in debugging-mode
doesn't like to free memory outside of DLL-code if it was allocated from
within the DLL. I don't face the problems with VC++6.0.

Further on I can get around this by replacing the DLL by a lib as indicated
below. But am I the only one with these problems? 


Franz

---------


In Win32PlatformUtils.cpp:
void XMLPlatformUtils::platformInit()
{
    //
    //  Lets get our own DLL path and store it. The fgLibLocation static
    //  member must be filled in with the path to the shared Lib or DLL
    //  so that other code can find any files relative to it.
    //
#if !defined(BOR_LIB)
    HINSTANCE hmod = ::GetModuleHandleA(XML4C_DLLName);
    if (!hmod)
    {
        //
        //  If we didn't find it, its probably because its a development
        //  build which is built as separate DLLs, so lets look for the DLL
        //  that we are part of.
        //
        static const char* const privDLLName = "IXUTIL";
        hmod = ::GetModuleHandle(privDLLName);

        // If neither exists, then we give up
        if (!hmod)
            panic(Panic_CantFindLib);
    }

    //
    //  Get the path to our module. We explicitly get the ASCII version here
    //  since its stored as ASCII (or the local code page to be more
specific,
    //  so it might be EBCDIC on some platforms.)
    //
    char tmpBuf[MAX_PATH + 1];
    if (!::GetModuleFileNameA(hmod, tmpBuf, MAX_PATH))
        panic(Panic_CantFindLib);

    // Find the last separator in the list and put a null in the next char
    char* sepPtr = 0;
    sepPtr = strrchr(tmpBuf, '\\');
    if (sepPtr)
        *(sepPtr+1)= 0;
    const unsigned int pathLen = strlen(tmpBuf);

    // Allocate a buffer and copy the text into it. Then store it in the
static
    char* actualBuf = new char[pathLen + 1];
    strcpy(actualBuf, tmpBuf);
    fgLibLocation = actualBuf;
#else
	fgLibLocation=".";
#endif

    //
    //  Figure out if we are on NT and save that flag for later use.
    //
    OSVERSIONINFO   OSVer;
    OSVer.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    ::GetVersionEx(&OSVer);
    gOnNT = (OSVer.dwPlatformId == VER_PLATFORM_WIN32_NT);

    //
    //  Ok, we have to do a little dance here to determine if we have any
    //  standard output handles. First we open up the potentially redirected
    //  standard handles.
    //
    gStdOut = ::GetStdHandle(STD_OUTPUT_HANDLE);
    gStdErr = ::GetStdHandle(STD_ERROR_HANDLE);

    //
    //  If we got the handles, then get the console mode for them. If this
    //  fails, then assume for the time being that they are just redirected
    //  files.
    //
    //  Above, when they are actually used, if they fail because of an
    //  invalid handle error, the gStdOut and gStdErr handles will get
zeroed
    //  out all further output will be eaten.
    //
    DWORD dummyParm;
    if (gStdOut)
    {
        if (!::GetConsoleMode(gStdOut, &dummyParm))
            gStdOutRedir = true;
    }

    if (gStdErr)
    {
        if (!::GetConsoleMode(gStdErr, &dummyParm))
            gStdErrRedir = true;
    }
}

and in VCPPDefs.hpp

//
---------------------------------------------------------------------------
//  A define in the build for each project is also used to control whether
//  the export keyword is from the project's viewpoint or the client's.
//  These defines provide the platform specific keywords that they need
//  to do this.
//
---------------------------------------------------------------------------
#if !defined(BOR_LIB)
#define PLATFORM_EXPORT     __declspec(dllexport)
#define PLATFORM_IMPORT     __declspec(dllimport)
#else
#define PLATFORM_EXPORT
#define PLATFORM_IMPORT
#endif