summaryrefslogtreecommitdiff
path: root/ext/com_dotnet/com_com.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/com_dotnet/com_com.c')
-rw-r--r--ext/com_dotnet/com_com.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/ext/com_dotnet/com_com.c b/ext/com_dotnet/com_com.c
index 09b2beaf3f..166dd07994 100644
--- a/ext/com_dotnet/com_com.c
+++ b/ext/com_dotnet/com_com.c
@@ -281,6 +281,58 @@ PHP_FUNCTION(com_create_instance)
}
/* }}} */
+/* {{{ proto object com_get_active_object(string progid [, int code_page ])
+ Returns a handle to an already running instance of a COM object */
+PHP_FUNCTION(com_get_active_object)
+{
+ CLSID clsid;
+ char *module_name;
+ long module_name_len;
+ long code_page = COMG(code_page);
+ IUnknown *unk = NULL;
+ IDispatch *obj = NULL;
+ HRESULT res;
+ OLECHAR *module = NULL;
+
+ if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l",
+ &module_name, &module_name_len, &code_page)) {
+ php_com_throw_exception(E_INVALIDARG, "Invalid arguments!" TSRMLS_CC);
+ return;
+ }
+
+ module = php_com_string_to_olestring(module_name, module_name_len, code_page TSRMLS_CC);
+
+ res = CLSIDFromString(module, &clsid);
+
+ if (FAILED(res)) {
+ php_com_throw_exception(res, NULL TSRMLS_CC);
+ } else {
+ res = GetActiveObject(&clsid, NULL, &unk);
+
+ if (FAILED(res)) {
+ php_com_throw_exception(res, NULL TSRMLS_CC);
+ } else {
+ res = IUnknown_QueryInterface(unk, &IID_IDispatch, &obj);
+
+ if (FAILED(res)) {
+ php_com_throw_exception(res, NULL TSRMLS_CC);
+ } else if (obj) {
+ /* we got our dispatchable object */
+ php_com_wrap_dispatch(return_value, obj, code_page TSRMLS_CC);
+ }
+ }
+ }
+
+ if (obj) {
+ IDispatch_Release(obj);
+ }
+ if (unk) {
+ IUnknown_Release(obj);
+ }
+ efree(module);
+}
+/* }}} */
+
/* Performs an Invoke on the given com object.
* returns a failure code and creates an exception if there was an error */
HRESULT php_com_invoke_helper(php_com_dotnet_object *obj, DISPID id_member,