📄 winapiwrapper.cpp
字号:
/* * Copyright (C) 2004 Sun Microsystems, Inc. All rights reserved. Use is * subject to license terms. * * This program is free software; you can redistribute it and/or modify * it under the terms of the Lesser GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA. */ #include <afx.h>#include <afxdisp.h>#include <stdio.h>#include <comdef.h>#include <atlbase.h>#include <ExDisp.h>#include <mapi.h>#include <stdlib.h>#include <string.h>#include <atlconv.h>#include <shlwapi.h>#include "WinAPIWrapper.h"#ifdef __cplusplusextern "C" {#endifconst int MAX_VALUE_LENGTH = 4096;const int MAX_MIME_DATA_LENGTH = 256;const char *EXCEPTION_CLASS = "org/jdesktop/jdic/desktop/internal/LaunchFailedException";// Native code for WinBrowserService// Global IWebBrowser2 object.CComQIPtr<IWebBrowser2, &IID_IWebBrowser2> m_spWebBrowser2;JNIEXPORT void JNICALL Java_org_jdesktop_jdic_desktop_internal_impl_WinAPIWrapper_shutDown (JNIEnv *, jclass) { m_spWebBrowser2.Release(); CoUninitialize();}JNIEXPORT jboolean JNICALL Java_org_jdesktop_jdic_desktop_internal_impl_WinAPIWrapper_nativeBrowseURLInIE(JNIEnv *env, jobject obj, jstring url, jstring target) { const char* urlStr = env->GetStringUTFChars(url, JNI_FALSE); const char* targetStr = env->GetStringUTFChars(target, JNI_FALSE); HRESULT hr; if(!m_spWebBrowser2) { hr = m_spWebBrowser2.CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_ALL); } CComVariant vDummy; CComVariant vURL((char*)urlStr); CComVariant vTarget((char*)targetStr); hr = m_spWebBrowser2->Navigate2(&vURL, &vDummy, &vTarget, &vDummy, &vDummy); env->ReleaseStringUTFChars(url, urlStr); env->ReleaseStringUTFChars(target, targetStr); return (hr == S_OK) ? true : false;}JNIEXPORT jintArray JNICALL Java_org_jdesktop_jdic_desktop_internal_impl_WinAPIWrapper_RegOpenKey (JNIEnv* env, jclass cl, jint hKey, jbyteArray lpSubKey, jint securityMask) { HKEY handle; const char* str; jint tmp[2]; int errorCode=-1; jintArray result; //Windows API invocation str = (const char*)env->GetByteArrayElements(lpSubKey, NULL); errorCode = RegOpenKeyEx((HKEY)hKey, str, 0, securityMask, &handle); env->ReleaseByteArrayElements(lpSubKey, (signed char*)str, 0); //constructs return value tmp[0]= (int) handle; tmp[1]= errorCode; result = env->NewIntArray(2); if (result != NULL) { env->SetIntArrayRegion(result, 0, 2, tmp); } return result;} JNIEXPORT jint JNICALL Java_org_jdesktop_jdic_desktop_internal_impl_WinAPIWrapper_RegCloseKey (JNIEnv* env, jclass cl, jint hKey) { return (jint) RegCloseKey((HKEY) hKey); }; JNIEXPORT jbyteArray JNICALL Java_org_jdesktop_jdic_desktop_internal_impl_WinAPIWrapper_RegQueryValueEx (JNIEnv* env, jclass cl, jint hKey, jbyteArray valueName) { const char* valueNameStr; unsigned char buffer[MAX_VALUE_LENGTH]; jbyteArray result = NULL; DWORD valueType; DWORD valueSize = MAX_VALUE_LENGTH; valueNameStr = (const char*)env->GetByteArrayElements(valueName, NULL); if (RegQueryValueEx((HKEY)hKey, valueNameStr, NULL, &valueType, buffer, &valueSize) == ERROR_SUCCESS) { if (valueSize > 0) { if ((valueType == REG_SZ)||(valueType == REG_EXPAND_SZ)) { result = env->NewByteArray(valueSize); if (result != NULL) { env->SetByteArrayRegion(result, 0, valueSize, (jbyte*)buffer); } } } else { result = NULL; } } env->ReleaseByteArrayElements(valueName, (signed char*)valueNameStr, 0); return result;} JNIEXPORT jbyteArray JNICALL Java_org_jdesktop_jdic_desktop_internal_impl_WinAPIWrapper_AssocQueryString (JNIEnv * env, jclass cl, jbyteArray fileOrProtocal, jbyteArray verb) { const TCHAR* fileOrProtocalStr; const TCHAR* verbStr; jbyteArray result = NULL; fileOrProtocalStr = (const char*)env->GetByteArrayElements(fileOrProtocal, NULL); verbStr = (const char*)env->GetByteArrayElements(verb, NULL); TCHAR pszOut[MAX_VALUE_LENGTH] = "\n"; DWORD pcchout = MAX_VALUE_LENGTH; HRESULT rc = AssocQueryString(ASSOCF_NOTRUNCATE, ASSOCSTR_COMMAND, fileOrProtocalStr, verbStr, pszOut, &pcchout); if (rc != S_OK) { result = NULL; } else { result = env->NewByteArray(pcchout + 1); if (result != NULL) { env->SetByteArrayRegion(result, 0, pcchout + 1, (jbyte*)pszOut); } } return result;}JNIEXPORT jbyteArray JNICALL Java_org_jdesktop_jdic_desktop_internal_impl_WinAPIWrapper_ExpandEnvironmentStrings (JNIEnv *env, jclass cl, jbyteArray envVariable) { const char* envVariableStr; jbyteArray result; int resultInt; jbyte buffer[MAX_VALUE_LENGTH]; envVariableStr = (const char*)env->GetByteArrayElements(envVariable, NULL); // If the function succeeds, the return value is the number of TCHARs stored in the buffer. // Or else, the return value is zero. if((resultInt = ExpandEnvironmentStrings(envVariableStr, (LPTSTR)buffer, MAX_VALUE_LENGTH)) == ERROR_SUCCESS) { result = envVariable; } else { result = env->NewByteArray(sizeof(TCHAR)*resultInt); if (result != NULL) { env->SetByteArrayRegion(result, 0, sizeof(TCHAR)*resultInt, (jbyte*)buffer); } } env->ReleaseByteArrayElements(envVariable, (signed char*)envVariableStr, 0); return result;} JNIEXPORT jstring JNICALL Java_org_jdesktop_jdic_desktop_internal_impl_WinAPIWrapper_resolveLinkFile (JNIEnv *env, jclass cl, jbyteArray filePath) { const char* filePathStr = (const char*)env->GetByteArrayElements(filePath, NULL); HRESULT hr; IShellLink *psl = NULL; IPersistFile *ppf = NULL; char szGotPath[MAX_PATH]; hr = CoInitialize(NULL); if (SUCCEEDED(hr)) { hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID *)&psl); if (SUCCEEDED(hr)) { hr = psl->QueryInterface(IID_IPersistFile, (LPVOID *)&ppf); if (SUCCEEDED(hr)) { WORD wsz[MAX_PATH]; // Ensure string is Unicode. MultiByteToWideChar(CP_ACP, 0, filePathStr, -1, wsz, MAX_PATH); hr = ppf->Load(wsz, STGM_READ); if (SUCCEEDED(hr)) { hr = psl->Resolve(0, SLR_ANY_MATCH); if (SUCCEEDED(hr)) { WIN32_FIND_DATA wfd; strcpy(szGotPath, filePathStr); hr = psl->GetPath(szGotPath, MAX_PATH, (WIN32_FIND_DATA *)&wfd, SLGP_SHORTPATH ); } } } } // CoCreateInstance() succeeds. } // CoInitialize(NULL) succeeds. if (ppf != NULL) ppf->Release(); if (psl != NULL) psl->Release(); CoUninitialize(); env->ReleaseByteArrayElements(filePath, (signed char*)filePathStr, 0); if (SUCCEEDED(hr)) { jstring targetFilePath = env->NewStringUTF(szGotPath); return targetFilePath; } else return NULL;} JNIEXPORT jint JNICALL Java_org_jdesktop_jdic_desktop_internal_impl_WinAPIWrapper_shellExecute (JNIEnv *env, jclass cl, jbyteArray filePath, jbyteArray verb) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -