Re: MS Windows, mingw compatibility of recent snapshots

al davis <[email protected]>
Newsgroups gmane.comp.gnu.gnucap.devel
Message-ID <[email protected]>
On Monday 01 January 2007 05:34, Holger Vogt wrote:
> enclosed you will find an improved patch of c_attach.cc for
> MS Windows with correct error message handling, now tested
> with the gnucap att and det commands.

Thanks..  I tried it on mingw, and it compiles now.  I have no 
way of testing it to see if it really works.

I made a header file defining dlopen etc. with the MS functions:
=====================
#include <windows.h>
#undef min
#undef max
inline void* dlopen(const char* f, int)
{
  return LoadLibrary(f);
}

inline void dlclose(void* h)
{
  FreeLibrary((HINSTANCE)h);
}

inline char* dlerror()
{
  static LPVOID lpMsgBuf = NULL;
  // free the error message buffer
  if (lpMsgBuf) {
    LocalFree(lpMsgBuf);
  }

  // get the error code
  DWORD dw = GetLastError();

  // get the corresponding error message
  FormatMessage(
		FORMAT_MESSAGE_ALLOCATE_BUFFER |
		FORMAT_MESSAGE_FROM_SYSTEM |
		FORMAT_MESSAGE_IGNORE_INSERTS,
		NULL,
		dw,
		MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
		(LPTSTR) &lpMsgBuf,
		0, NULL);

  return (char*)lpMsgBuf;
}

#define RTLD_NOW 2
#define RTLD_LOCAL 0
======================================
I suppose you could call it "dlfcn.h", but I called 
it "ms-dlfcn.h", so the only #ifdef is to select which to 
include.  It should move to md.h,, where all other portability 
hacks are.

I also changed the way the buffer is free'd.  The pointer is 
static, and gets freed on the next call, so they don't build 
up.  The way you did it causes a memory leak because 
cmd.warn(bERROR, ...  throws an exception and does not return.  
It must be compatible with dlerror() which returns a pointer to 
a static string.

In this case, defining the missing functions in terms of the 
ones available is the correct way to do it.  Why doesn't mingw 
provide this, and call it "dlfcn.h"??  It is a standard library 
function, as specified by POSIX.1-2001.

When a standard function is missing, I prefer to design for the 
correct library, and make an interface to supply the missing 
functions in a form as close to the standard as possible.  With 
no #define's it should use the standard, a #define 
like "MS_DLOPEN_IS_MISSING" enables the hack.  It is not a good 
idea to use something implied like _WIN32, because hopefully 
someday they will fix it.

Thanks again.  The next snapshot will have the patch, in md.h.
Can you make sure I didn't mess it up?

al.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.