⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dotnet.cpp

📁 php-4.4.7学习linux时下载的源代码
💻 CPP
字号:
/*   +----------------------------------------------------------------------+   | PHP Version 4                                                        |   +----------------------------------------------------------------------+   | Copyright (c) 1997-2006 The PHP Group                                |   +----------------------------------------------------------------------+   | This source file is subject to version 3.01 of the PHP license,      |   | that is bundled with this package in the file LICENSE, and is        |   | available through the world-wide-web at the following url:           |   | http://www.php.net/license/3_01.txt                                  |   | If you did not receive a copy of the PHP license and are unable to   |   | obtain it through the world-wide-web, please send a note to          |   | license@php.net so we can mail you a copy immediately.               |   +----------------------------------------------------------------------+   | Author: Sam Ruby <rubys@us.ibm.com>                                  |   |         Harald Radi <h.radi@nme.at>                                  |   +----------------------------------------------------------------------+ *//* * This module implements support for Microsoft .Net components. *//* * 28.1.2001 * use external unicode conversion functions * * harald radi <h.radi@nme.at> */#ifdef PHP_WIN32#include <iostream>#include <math.h>#include <comdef.h>extern "C"{#include "php.h"#include "ext/standard/info.h"}#include "ext/com/conversion.h"#include "ext/com/php_COM.h"#include "Mscoree.h"#include "mscorlib.h"using namespace mscorlib;static ICorRuntimeHost *pHost;static mscorlib::_AppDomain *pDomain;static zend_class_entry dotnet_class_entry;static int codepage;HRESULT dotnet_init() {  HRESULT hr;  hr = CoCreateInstance(CLSID_CorRuntimeHost, NULL, CLSCTX_ALL,    IID_ICorRuntimeHost, (void **)&pHost);  if (FAILED(hr)) return hr;   hr = pHost->Start();  if (FAILED(hr)) return hr;  IUnknown *uDomain;  hr = pHost->GetDefaultDomain(&uDomain);  if (FAILED(hr)) return hr;  hr = uDomain->QueryInterface(__uuidof(_AppDomain), (void**) &pDomain);  if (FAILED(hr)) return -1;  uDomain->Release();  return ERROR_SUCCESS;}HRESULT dotnet_create(OLECHAR *assembly, OLECHAR *datatype, comval *obj TSRMLS_DC) {  HRESULT hr;  _ObjectHandle *pHandle;  hr = pDomain->CreateInstance(_bstr_t(assembly), _bstr_t(datatype), &pHandle);   if (FAILED(hr)) return hr;  if (!pHandle) return hr;  _variant_t unwrapped;  hr = pHandle->Unwrap(&unwrapped);  pHandle->Release();  if (FAILED(hr)) return hr;   php_COM_set(obj, &unwrapped.pdispVal, TRUE TSRMLS_CC);  return ERROR_SUCCESS;}  void dotnet_term() {  if (pHost) pHost->Stop();  if (pHost) pHost->Release();  if (pDomain) pDomain->Release();  pHost = 0;  pDomain = 0;}/* {{{ proto int dotnet_load(string assembly_name [, string datatype_name, int codepage])   Loads a DOTNET module */PHP_FUNCTION(dotnet_load){	HRESULT hr;	pval *assembly_name, *datatype_name, *code_page;	OLECHAR *assembly, *datatype;	comval *obj;	switch(ZEND_NUM_ARGS())	{		case 2:			getParameters(ht, 2, &assembly_name, &datatype_name);			codepage = CP_ACP;			break;		case 3:			getParameters(ht, 3, &assembly_name, &datatype_name, &code_page);			convert_to_long(code_page);			codepage = Z_LVAL_P(code_page);			break;		default:			WRONG_PARAM_COUNT;			break;	}	convert_to_string(assembly_name);	assembly = php_char_to_OLECHAR(Z_STRVAL_P(assembly_name), Z_STRLEN_P(assembly_name), codepage TSRMLS_CC);	convert_to_string(datatype_name);	datatype = php_char_to_OLECHAR(Z_STRVAL_P(datatype_name), Z_STRLEN_P(datatype_name), codepage TSRMLS_CC);	ALLOC_COM(obj);	/* obtain IDispatch */	hr = dotnet_create(assembly, datatype, obj TSRMLS_CC);	efree(assembly);	efree(datatype);	if (FAILED(hr)) {		char *error_message;		error_message = php_COM_error_message(hr TSRMLS_CC);		php_error(E_WARNING, "Error obtaining .Net class for %s in assembly %s: %s", datatype_name->value.str.val, assembly_name->value.str.val, error_message);		LocalFree(error_message);		efree(obj);		RETURN_FALSE;	}	if (C_DISPATCH(obj) == NULL) {		php_error(E_WARNING, "Unable to locate %s in assembly %s", datatype_name->value.str.val, assembly_name->value.str.val);		efree(obj);		RETURN_FALSE;	}	RETURN_LONG(zend_list_insert(obj, IS_COM));}/* }}} */void php_DOTNET_call_function_handler(INTERNAL_FUNCTION_PARAMETERS, zend_property_reference *property_reference){	pval *object = property_reference->object;	zend_overloaded_element *function_name = (zend_overloaded_element *) property_reference->elements_list->tail->data;	if (zend_llist_count(property_reference->elements_list)==1		&& !strcmp(Z_STRVAL(function_name->element), "dotnet")) { /* constructor */		pval *object_handle;		PHP_FN(dotnet_load)(INTERNAL_FUNCTION_PARAM_PASSTHRU);		if (!Z_LVAL_P(return_value)) {			ZVAL_FALSE(object);			return;		}		ALLOC_ZVAL(object_handle);		*object_handle = *return_value;		pval_copy_constructor(object_handle);		INIT_PZVAL(object_handle);		zend_hash_index_update(Z_OBJPROP_P(object), 0, &object_handle, sizeof(pval *), NULL);		pval_destructor(&function_name->element);	} else {		php_COM_call_function_handler(INTERNAL_FUNCTION_PARAM_PASSTHRU, property_reference);	}}void php_register_DOTNET_class(TSRMLS_D){	INIT_OVERLOADED_CLASS_ENTRY(dotnet_class_entry, "DOTNET", NULL,								php_DOTNET_call_function_handler,								php_COM_get_property_handler,								php_COM_set_property_handler);	zend_register_internal_class(&dotnet_class_entry TSRMLS_CC);}function_entry DOTNET_functions[] = {	{NULL, NULL, NULL}};static PHP_MINFO_FUNCTION(DOTNET){	php_info_print_table_start();	php_info_print_table_row(2, ".NET support", "enabled");	php_info_print_table_end();}PHP_MINIT_FUNCTION(DOTNET){	HRESULT hr;	if (FAILED(hr = dotnet_init())) {		return hr;	}	php_register_DOTNET_class(TSRMLS_C);	return SUCCESS;}PHP_MSHUTDOWN_FUNCTION(DOTNET){	dotnet_term();	return SUCCESS;}zend_module_entry dotnet_module_entry = {	STANDARD_MODULE_HEADER,	"dotnet", DOTNET_functions, PHP_MINIT(DOTNET), PHP_MSHUTDOWN(DOTNET), NULL, NULL, PHP_MINFO(DOTNET), NO_VERSION_YET, STANDARD_MODULE_PROPERTIES};BEGIN_EXTERN_C()ZEND_GET_MODULE(dotnet)END_EXTERN_C()#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -