Here is a SDS routine , that when loaded will enable lisp to Set/Get text to/from the clipboard. Enjoy.
PS. If you have any questions about SDS or would like me to email the compiled .dll to you, just ask.
Code: Select all
/* ++
* SDSs.C © 2007, Daniel Marcotte
* Intellicad SDS Addon -- SetClipboardText GetClipboardText
* for lisp
* Party On!
* SetClipboardText (SetClipboardText "How yuz doin'")
* GetClipboardText (GetClipboardText)
* -- */
//////////////////////////////////////////////////////////////////////
//Includes
//////////////////////////////////////////////////////////////////////
#include <windows.h>
#include <stdio.h>
#include <sds.h>
#include <TCHAR.h>
//////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////
#define INIBUFFSIZ 8192
#define WIN32_LEAN_AND_MEAN
#define ARRAYELEMENTS(array) (sizeof(array)/sizeof((array)[0]))
#define DllExport __declspec(dllexport)
#ifdef UNICODE
#define CF_TCHAR CF_UNICODETEXT
#else
#define CF_TCHAR CF_TEXT
#endif
//////////////////////////////////////////////////////////////////////
//Protos
//////////////////////////////////////////////////////////////////////
int funcload(void);
void funcunload(void);
int dofun(void);
int SDS_GetGlobals(TCHAR *appname, HWND * hwnd, HINSTANCE * hInstance);
void DllExport SDS_EntryPoint(HWND hWnd);
int SetClipboardText(void);
int GetClipboardText(void);
#pragma region EntryPoint
//////////////////////////////////////////////////////////////////////
//Variables
//////////////////////////////////////////////////////////////////////
TCHAR adsw_AppName[512];
TCHAR *sds_argVec = adsw_AppName;
TCHAR sds_appname[512];
HWND adsw_hwndAcad;
HINSTANCE adsw_hInstance;
HWND adsw_hWnd;
int adsw_wait;
sds_matrix sds_identmat;
//struct
typedef struct {
TCHAR *func_name;
int (*func) (void);
} func_def;
// Put your function names here
static func_def func_table[] = {
{_T("SetClipboardText"), SetClipboardText},
{_T("GetClipboardText"), GetClipboardText}
};
//////////////////////////////////////////////////////////////////////
//SDS Main
//////////////////////////////////////////////////////////////////////
int SDS_main(int argc, TCHAR **argv)
{
short scode = RSRSLT;
int stat;
TCHAR errmsg[80];
sds_init(argc, argv);
for (;;)
{
if ((stat = sds_link(scode)) < 0)
{
sprintf(errmsg, _T("sds_link() Failed = %d\n"), stat);
sds_printf(errmsg);
sds_exit(-1);
}
scode = RSRSLT;
switch (stat)
{
case RQXLOAD:
{
scode = (short)(funcload() == RTNORM ? RSRSLT : RSERR);
}
break;
case SDS_RQXUNLD:
funcunload();
break;
case RQSUBR:
{
scode = (short)(dofun() == RTNORM ? RSRSLT : RSERR);
}
break;
case SDS_RQSAVE:
break;
case SDS_RQEND:
break;
case SDS_RQQUIT:
break;
case SDS_RQCFG:
break;
case SDS_RQHUP:
break;
case SDS_RQXHELP:
break;
default:
break;
}
}
}
//load
int funcload(void)
{
for (short i = 0; i < ARRAYELEMENTS(func_table); i++)
{
if (!sds_defun(func_table[i].func_name, i))
return RTERROR;
}
return RTNORM;
}
//Unload
void funcunload(void)
{
for (short i = 0; i < ARRAYELEMENTS(func_table); i++)
{
ads_undef(func_table[i].func_name, i);
}
}
//Run function
int dofun(void)
{
int val, rc;
val = sds_getfuncode();
if (val < 0 || ARRAYELEMENTS(func_table) <= val)
{
sds_fail(_T("Failed"));
return RTERROR;
}
rc = (*func_table[val].func) ();
return rc;
}
//////////////////////////////////////////////////////////////////////
//Entry Point
//////////////////////////////////////////////////////////////////////
void DllExport SDS_EntryPoint(HWND hWnd)
{
for (int i = 0; i <= 3; i++)
for (int j = 0; j <= 3; j++)
sds_identmat[i][j] = 0.0;
for (int i = 0; i <= 3; i++)
sds_identmat[i][i] = 1.0;
SDS_GetGlobals(adsw_AppName, &adsw_hwndAcad, &adsw_hInstance);
strncpy(sds_appname, adsw_AppName, sizeof(sds_appname) - 1);
SDS_main(1, &sds_argVec);
return;
}
#pragma endregion
#pragma region ClipboardText
//(SetClipboardText "How yuz doin'")
int SetClipboardText(void)
{
TCHAR Buf[INIBUFFSIZ];
struct resbuf *pArgs = sds_getargs();
if (pArgs == NULL && pArgs->restype != RTSTR)
return RSERR;
_tcscpy(Buf, pArgs->resval.rstring);
if (!OpenClipboard(NULL))
return RSERR;
HGLOBAL hglClipBuff;
TCHAR *pszBuf;
EmptyClipboard();
hglClipBuff = GlobalAlloc(GMEM_MOVEABLE, (_tcslen(Buf) + 1) * sizeof(TCHAR));
pszBuf = (TCHAR *)GlobalLock(hglClipBuff);
_tcscpy(pszBuf, Buf);
GlobalUnlock(hglClipBuff);
SetClipboardData(CF_TCHAR, hglClipBuff);
CloseClipboard();
sds_rett();
return (RSRSLT);
}
//(GetClipboardText)
int GetClipboardText(void)
{
TCHAR *pszBuf;
TCHAR *pszStrout;
HGLOBAL hglClipBuff;
if (!OpenClipboard(NULL))
return RSERR;
if ((hglClipBuff = GetClipboardData(CF_TCHAR)) != NULL)
{
pszStrout = (TCHAR *)GlobalLock(hglClipBuff);
pszBuf = (TCHAR *)sds_malloc(GlobalSize(hglClipBuff));
if (pszBuf == NULL)
return RSERR;
_tcscpy(pszBuf, pszStrout);
GlobalUnlock(hglClipBuff);
}
CloseClipboard();
if (pszBuf == NULL)
return RSERR;
sds_retstr(pszBuf);
sds_free(pszBuf);
pszBuf = NULL;
return (RSRSLT);
}
#pragma endregion