summaryrefslogtreecommitdiff
path: root/jim-win32com.c
diff options
context:
space:
mode:
authorpatthoyts <patthoyts>2005-03-02 07:18:20 +0000
committerpatthoyts <patthoyts>2005-03-02 07:18:20 +0000
commit7572023231ea04c5fb5d1a7cf206d3d31e9df9aa (patch)
tree137fc80f80082d65a1904cb926b56dd73734ac40 /jim-win32com.c
parent3e101ed7a9781fd9b39588de8bd150af543284d8 (diff)
Slowly progressing.
Diffstat (limited to 'jim-win32com.c')
-rw-r--r--jim-win32com.c162
1 files changed, 116 insertions, 46 deletions
diff --git a/jim-win32com.c b/jim-win32com.c
index 7f72325..a821d6b 100644
--- a/jim-win32com.c
+++ b/jim-win32com.c
@@ -15,6 +15,9 @@
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <ole2.h>
+#include <tchar.h>
+#include <assert.h>
+#include <stdarg.h>
#define JIM_EXTENSION
#include "jim.h"
@@ -29,6 +32,33 @@
#pragma comment(lib, "uuid")
#endif /* _MSC_VER >= 1000 */
+/* ----------------------------------------------------------------------
+ * Debugging bits
+ */
+
+#ifndef _DEBUG
+#define JIM_ASSERT(x) ((void)0)
+#define JIM_TRACE 1 ? ((void)0) : LocalTrace
+#else /* _DEBUG */
+#define JIM_ASSERT(x) if (!(x)) _assert(#x, __FILE__, __LINE__)
+#define JIM_TRACE LocalTrace
+#endif /* _DEBUG */
+
+void
+LocalTrace(LPCTSTR format, ...)
+{
+ int n;
+ const int max = sizeof(TCHAR) * 512;
+ TCHAR buffer[512];
+ va_list args;
+ va_start (args, format);
+
+ n = _vsntprintf(buffer, max, format, args);
+ JIM_ASSERT(n < max);
+ OutputDebugString(buffer);
+ va_end(args);
+}
+
/* ---------------------------------------------------------------------- */
static Jim_Obj *
@@ -39,13 +69,13 @@ Win32ErrorObj(Jim_Interp *interp, const char * szPrefix, DWORD dwError)
DWORD dwLen = 0;
dwLen = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER
- | FORMAT_MESSAGE_FROM_SYSTEM, NULL, dwError, LANG_NEUTRAL,
- (char *)&lpBuffer, 0, NULL);
+ | FORMAT_MESSAGE_FROM_SYSTEM, NULL, dwError, LANG_NEUTRAL,
+ (char *)&lpBuffer, 0, NULL);
if (dwLen < 1) {
dwLen = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER
- | FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY,
- "code 0x%1!08X!%n", 0, LANG_NEUTRAL,
- (char *)&lpBuffer, 0, (va_list *)&dwError);
+ | FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY,
+ "code 0x%1!08X!%n", 0, LANG_NEUTRAL,
+ (char *)&lpBuffer, 0, (va_list *)&dwError);
}
msgObj = Jim_NewStringObj(interp, szPrefix, -1);
@@ -54,8 +84,8 @@ Win32ErrorObj(Jim_Interp *interp, const char * szPrefix, DWORD dwError)
for ( ; p && *p && isspace(*p); p--)
;
*++p = 0;
- Jim_AppendString(interp, msgObj, ": ", 2);
- Jim_AppendString(interp, msgObj, lpBuffer, -1);
+ Jim_AppendString(interp, msgObj, ": ", 2);
+ Jim_AppendString(interp, msgObj, lpBuffer, -1);
}
LocalFree((HLOCAL)lpBuffer);
return msgObj;
@@ -93,7 +123,7 @@ UnicodeDupInternalRep(Jim_Interp *interp, Jim_Obj *srcPtr, Jim_Obj *dupPtr)
dupPtr->internalRep.binaryValue.len = len;
dupPtr->internalRep.binaryValue.data = Jim_Alloc(len + sizeof(WCHAR));
wcsncpy((LPWSTR)dupPtr->internalRep.binaryValue.data,
- (LPWSTR)srcPtr->internalRep.binaryValue.data, len);
+ (LPWSTR)srcPtr->internalRep.binaryValue.data, len);
}
int
@@ -115,21 +145,21 @@ UnicodeSetFromAny(Jim_Interp *interp, Jim_Obj *objPtr)
objPtr->typePtr = &unicodeObjType;
return JIM_OK;
}
-
+
Jim_Obj *
Jim_NewUnicodeObj(Jim_Interp *interp, LPCWSTR wsz, size_t len)
{
Jim_Obj *objPtr = Jim_NewObj(interp);
if (len < 0)
- len = wcslen(wsz);
+ len = wcslen(wsz);
if (len == 0) {
- objPtr->bytes = "";
- objPtr->length = 0;
+ objPtr->bytes = "";
+ objPtr->length = 0;
} else {
- objPtr->internalRep.binaryValue.data = Jim_Alloc(len + sizeof(WCHAR));
- wcsncpy((LPWSTR)objPtr->internalRep.binaryValue.data, wsz, len);
- ((LPWSTR)objPtr->internalRep.binaryValue.data)[len] = 0;
- objPtr->internalRep.binaryValue.len = len;
+ objPtr->internalRep.binaryValue.data = Jim_Alloc(len + sizeof(WCHAR));
+ wcsncpy((LPWSTR)objPtr->internalRep.binaryValue.data, wsz, len);
+ ((LPWSTR)objPtr->internalRep.binaryValue.data)[len] = 0;
+ objPtr->internalRep.binaryValue.len = len;
}
objPtr->typePtr = &unicodeObjType;
return objPtr;
@@ -139,9 +169,11 @@ LPWSTR
Jim_GetUnicode(Jim_Obj *objPtr, int *lenPtr)
{
if (objPtr->typePtr != &unicodeObjType) {
- if (UnicodeSetFromAny(NULL, objPtr) != JIM_OK) {
- ;//Jim_Panic("Jim_GetUnicode cannot convert item to unicode rep", objPtr->typePtr->name);
- }
+ if (UnicodeSetFromAny(NULL, objPtr) != JIM_OK) {
+ JIM_ASSERT("Jim_GetUnicode cannot convert item to unicode rep");
+ //Jim_Panic("Jim_GetUnicode cannot convert item to unicode rep",
+ //objPtr->typePtr->name);
+ }
}
return (LPWSTR)objPtr->internalRep.binaryValue.data;
@@ -163,9 +195,12 @@ Jim_ObjType ole32ObjType = {
void
Ole32FreeInternalRep(Jim_Interp *interp, Jim_Obj *objPtr)
{
+ int r = JIM_OK;
IDispatch *p = (IDispatch *)objPtr->internalRep.ptr;
+ r = Jim_DeleteCommand(interp, objPtr->bytes);
+ JIM_ASSERT(r == JIM_OK && "Failed to delete ole32 command instance.");
p->lpVtbl->Release(p);
- fprintf(stderr, "free ole32 object 0x%08x\n", (unsigned long)p);
+ JIM_TRACE("free ole32 object 0x%08x\n", (unsigned long)p);
}
void
@@ -174,20 +209,49 @@ Ole32DupInternalRep(Jim_Interp *interp, Jim_Obj *srcPtr, Jim_Obj *dupPtr)
IDispatch *p = (IDispatch *)srcPtr->internalRep.ptr;
dupPtr->internalRep.ptr = p;
p->lpVtbl->AddRef(p);
- fprintf(stderr, "dup ole32 object 0x%08x\n", (unsigned long)p);
+ JIM_TRACE("dup ole32 object 0x%08x\n", (unsigned long)p);
+}
+
+/* $object method|prop ?args...? */
+static int
+Ole32_Invoke(Jim_Interp *interp, int objc, Jim_Obj **objv)
+{
+ HRESULT hr = S_OK;
+ LPWSTR name;
+ DISPID dispid;
+ Jim_Obj *objPtr = (Jim_Obj *)Jim_CmdPrivData(interp);
+ IDispatch *pdisp = (IDispatch *)objPtr->internalRep.ptr;
+
+ if (objc < 2) {
+ Jim_WrongNumArgs(interp, 1, objv, " method|property ?args ...?");
+ return JIM_ERR;
+ }
+
+ name = Jim_GetUnicode(objv[1], NULL);
+ hr = pdisp->lpVtbl->GetIDsOfNames(pdisp, &IID_NULL, &name, 1,
+ LOCALE_SYSTEM_DEFAULT, &dispid);
+
+ if (SUCCEEDED(hr)) {
+ Jim_SetResultString(interp, "ook", -1);
+ }
+
+ if (FAILED(hr))
+ Jim_SetResult(interp, Win32ErrorObj(interp, "dispatch", (DWORD)hr));
+ return SUCCEEDED(hr) ? JIM_OK : JIM_ERR;
}
Jim_Obj *
Jim_NewOle32Obj(Jim_Interp *interp, LPDISPATCH pdispatch)
{
Jim_Obj *objPtr = Jim_NewObj(interp);
- objPtr->bytes = Jim_Alloc(22);
- sprintf(objPtr->bytes, "ole32%08x", (unsigned long)pdispatch);
+ objPtr->bytes = Jim_Alloc(23);
+ sprintf(objPtr->bytes, "ole32:%08x", (unsigned long)pdispatch);
objPtr->length = strlen(objPtr->bytes);
objPtr->internalRep.ptr = (void *)pdispatch;
pdispatch->lpVtbl->AddRef(pdispatch);
objPtr->typePtr = &ole32ObjType;
- fprintf(stderr, "created ole32 object 0x%08x\n", pdispatch);
+ Jim_CreateCommand(interp, objPtr->bytes, Ole32_Invoke, (void *)objPtr);
+ JIM_TRACE("created ole32 object 0x%08x\n", pdispatch);
return objPtr;
}
@@ -202,33 +266,33 @@ Ole32_Command(Jim_Interp *interp, int objc, Jim_Obj **objv)
char *cmd;
if (objc != 3) {
- Jim_WrongNumArgs(interp, 1, objv, "createobject");
- return JIM_ERR;
+ Jim_WrongNumArgs(interp, 1, objv, "createobject");
+ return JIM_ERR;
}
cmd = Jim_GetString(objv[1], NULL);
if (strncmp(cmd, "create", 6) == 0) {
- IDispatch *pdisp = NULL;
- CLSID clsid;
- HRESULT hr = S_OK;
- LPWSTR wsz = Jim_GetUnicode(objv[2], NULL);
- hr = CLSIDFromProgID(wsz, &clsid);
- if (SUCCEEDED(hr))
- hr = CoCreateInstance(&clsid, NULL, CLSCTX_ALL, &IID_IDispatch, (LPVOID*)&pdisp);
- if (hr == E_NOINTERFACE)
- hr = CoCreateInstance(&clsid, NULL, CLSCTX_LOCAL_SERVER, &IID_IDispatch, (LPVOID*)&pdisp);
- if (SUCCEEDED(hr)) {
- Jim_SetResult(interp, Jim_NewOle32Obj(interp, pdisp));
- pdisp->lpVtbl->Release(pdisp);
- } else {
- Jim_SetResult(interp, Win32ErrorObj(interp, "CreateObject", hr));
- }
+ IDispatch *pdisp = NULL;
+ CLSID clsid;
+ HRESULT hr = S_OK;
+ LPWSTR wsz = Jim_GetUnicode(objv[2], NULL);
+ hr = CLSIDFromProgID(wsz, &clsid);
+ if (SUCCEEDED(hr))
+ hr = CoCreateInstance(&clsid, NULL, CLSCTX_ALL, &IID_IDispatch, (LPVOID*)&pdisp);
+ if (hr == E_NOINTERFACE)
+ hr = CoCreateInstance(&clsid, NULL, CLSCTX_LOCAL_SERVER, &IID_IDispatch, (LPVOID*)&pdisp);
+ if (SUCCEEDED(hr)) {
+ Jim_SetResult(interp, Jim_NewOle32Obj(interp, pdisp));
+ pdisp->lpVtbl->Release(pdisp);
+ } else {
+ Jim_SetResult(interp, Win32ErrorObj(interp, "CreateObject", hr));
+ }
} else {
- Jim_SetResultString(interp, "bad option: must be create object", -1);
- hr = E_FAIL;
+ Jim_SetResultString(interp, "bad option: must be create object", -1);
+ hr = E_FAIL;
}
- return SUCCEEDED(hr) ? JIM_OK : JIM_ERR;
+ return SUCCEEDED(hr) ? JIM_OK : JIM_ERR;
}
/* ---------------------------------------------------------------------- */
@@ -241,10 +305,16 @@ Jim_OnLoad(Jim_Interp *interp)
hr = CoInitialize(0);
if (FAILED(hr)) {
Jim_SetResult(interp,
- Win32ErrorObj(interp, "CoInitialize", (DWORD)hr));
- return JIM_ERR;
+ Win32ErrorObj(interp, "CoInitialize", (DWORD)hr));
+ return JIM_ERR;
}
Jim_CreateCommand(interp, "ole32", Ole32_Command, NULL);
return JIM_OK;
}
+/* ----------------------------------------------------------------------
+ * Local variables:
+ * mode: c
+ * indent-tabs-mode: nil
+ * End:
+ */