delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2001/07/31/13:55:12

Mailing-List: contact cygwin-help AT sourceware DOT cygnus DOT com; run by ezmlm
List-Subscribe: <mailto:cygwin-subscribe AT sources DOT redhat DOT com>
List-Archive: <http://sources.redhat.com/ml/cygwin/>
List-Post: <mailto:cygwin AT sources DOT redhat DOT com>
List-Help: <mailto:cygwin-help AT sources DOT redhat DOT com>, <http://sources.redhat.com/ml/#faqs>
Sender: cygwin-owner AT sources DOT redhat DOT com
Delivered-To: mailing list cygwin AT sources DOT redhat DOT com
X-Lotus-FromDomain: JPMORGAN AT SMTP
From: "Slavek F Kuzniar" <kuzniar_slavek AT jpmorgan DOT com>
To: cygwin AT cygwin DOT com
Message-ID: <85256A9A.006165B8.00@nyc-ntgw-n01.ny.jpmorgan.com>
Date: Tue, 31 Jul 2001 13:43:51 -0400
Subject: Excel add-in and cygwin.dll
Mime-Version: 1.0

I am trying to find out if it is possible to build Excel Add-In that is using
Cygwin DLL and is capable of calling Excel functions through
xlcall32 library.
I believe someone on this list mentioned that you can do this only when
'-mno-cygwin' option is used so no cygwin1.dll is linked.

I tried building very simple XLL that can be loaded into Excel using Add-In
manager. When using 'no-cygwin' option
XLL loads fine. When I remove 'no-cygwin' option Excel crashes inside
cygwin1.dll. Even when I remove 'Excel4(...)' call which does not link
xlcall32.dll, add-in still crashes.

Following is the program, makefile, def file and 'cygcheck tst.xll' output in
case someone wants to try it. libxlcall32.a was created using
dlltool and hand-crafted .def file.


--------- tst.cpp
#include <windows.h>
#include <stdlib.h>
#include <xlcall.h>

#define DllImport __declspec(dllimport)
#define DllExport __declspec(dllexport)

/**     XLOPER string object. No virtual functions please.
        */
struct XLOPERString : public XLOPER
{
        /// Construct XLOPER string object
        XLOPERString(const char* txt)
        {
                if (txt)
                {
                        val.str = (char*) malloc(strlen(txt)+1);
                        strncpy(val.str + 1, txt, strlen(txt));
                        val.str[0] = strlen(txt);
                        xltype = xltypeStr;
                }
                else
                {
                        val.str = 0;
                }
        }
        /// Destroy XLOPER string object
        ~XLOPERString()
        {
                if (val.str)
                        free(val.str);
        }
};

/**     XLOPER integer object. No virtual functions please.
        */
struct XLOPERInt : public XLOPER
{
        /// Construct XLOPER integer object
        XLOPERInt(int ival)
        {
                xltype = xltypeInt;
                val.w = ival;
        }
};


#ifdef __cplusplus
extern "C" {
#endif
BOOL APIENTRY DllMain( HANDLE hDLL, DWORD dwReason, LPVOID lpReserved );
int DllExport WINAPI xlAutoOpen (void);
int DllExport WINAPI xlAutoAdd  (void);
#ifdef __cplusplus
}
#endif


BOOL APIENTRY DllMain( HANDLE hDLL, DWORD dwReason, LPVOID lpReserved )
{
        return TRUE;
}

int DllExport WINAPI xlAutoOpen(void)
{
        XLOPERString    ss("addin opened");
        XLOPERInt       ii(2);
        Excel4(xlcAlert, 0, 2, (LPXLOPER) &ss, (LPXLOPER) &ii);
        return 1;
}

int DllExport WINAPI xlAutoAdd(void)
{
        XLOPERString    ss("addin added");
        XLOPERInt       ii(2);
        Excel4(xlcAlert, 0, 2, (LPXLOPER) &ss, (LPXLOPER) &ii);
        return 1;
}


---------- makefile
C       = gcc
CC      = g++
CFLAGS  = -I. -g -mno-cygwin
CCFLAGS = -I. -g -mno-cygwin

LEX     = flex++
LFLAGS  = -Sflex_std.skl

LD      = dllwrap
LDFLAGS = -verbose --def tst.def -mno-cygwin -s -dll -mwindows -L../xlsdk -e
_DllMain AT 12

LIBS    = -lxlcall32

TARGET  = tst.xll

.SUFFIXES : .o .c .cpp .l


.c.o :
        ${C} ${CFLAGS} -c $<

.cpp.o :
        ${CC} ${CCFLAGS} -c $<

.l.cpp :
        ${LEX} ${LEXFLAGS} $<

OBJS    = \
        tst.o

${TARGET} : ${OBJS}
        ${LD} ${LDFLAGS} -s --dll -o $@ ${OBJS} ${LIBS}

clean :
        rm -rf *.o *~ doc ${TARGET}


----------- tst.def file
EXPORTS
        xlAutoOpen
        xlAutoAdd

----------- cygcheck output
Found: .\tst.xll
.\tst.xll
  c:/ct2/xlcall32.dll
    C:\WINNT\System32\KERNEL32.dll
      C:\WINNT\System32\ntdll.dll
  C:\WINNT\System32\msvcrt.dll

Use -h to see help about each section

----------- cygcheck output (with cygwin)
Found: .\tst.xll
.\tst.xll
  c:/ct2/xlcall32.dll
    C:\WINNT\System32\KERNEL32.dll
      C:\WINNT\System32\ntdll.dll
  C:\WINNT\System32\cygwin1.dll

Use -h to see help about each section







This communication is for informational purposes only.  It is not intended as
an offer or solicitation for the purchase or sale of any financial instrument
or as an official confirmation of any transaction. All market prices, data
and other information are not warranted as to completeness or accuracy and
are subject to change without notice. Any comments or statements made herein
do not necessarily reflect those of J.P. Morgan Chase & Co., its
subsidiaries and affiliates.


--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Bug reporting:         http://cygwin.com/bugs.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019