最近因为工作需要,要在java应用程序中打开一个网站,方法有多种,如通过Runtime.getRuntime().exec(""),但是这种方法关不掉session。
最后选择通过JNI来打开一个IE,ie在装载网页的办法,这种方法可以关掉session,下面我把代码贴出来,以供参考
struct EnumParam
{
HWND hMainWnd;
DWORD dwProcessID;
};
// 唯一的一个 CcjniApp 对象
CCjniApp theApp;
//HINSTANCE m_handle;
CString getIEpath();
//查找窗口句柄
BOOL CALLBACK EnumWinProc(HWND hwnd, LPARAM lParam)
{
DWORD dwID;
EnumParam* pep = (EnumParam*)lParam;
if (!(GetWindowLong(hwnd,GWL_STYLE) & WS_VISIBLE))
{
return TRUE;
}
GetWindowThreadProcessId(hwnd, &dwID);
if (dwID == pep->dwProcessID) {
pep->hMainWnd = hwnd;
return 0;
}
return TRUE;
}
DWORD myProcessID = 0;
HANDLE myProcessHandle;
JNIEXPORT jstring JNICALL Java_coc_jni_JniEx_showIE(JNIEnv *env, jobject obj,jstring str)
{
EnumParam ep;
STARTUPINFO si;
PROCESS_INFORMATION pi;
ep.hMainWnd = NULL;
memset(&si, 0, sizeof(si));
si.cb = sizeof(STARTUPINFO);
jboolean isCopy=FALSE;
jsize len = (*env).GetStringLength(str);
const jchar *commandstr = (*env).GetStringChars(str,&isCopy);
const jchar *wndClassStr = NULL;
CString str1 = CString(commandstr);
(*env).ReleaseStringChars(str, commandstr);
if(str1.Find("close")!=-1)
{
::TerminateProcess(myProcessHandle,0);
myProcessID = 0;
myProcessHandle =NULL;
return NULL;
}
//strcpy((LPTSTR)&str1,(LPCTSTR)commandstr);
//int size = 0;
//size = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)commandstr, len, commandcstr,(len*2+1), NULL, NULL );
CString m_strPath = getIEpath();
CString path = m_strPath+" "+str1;
DWORD dwTick;
bool bCreateProcssFlag = true;
if(myProcessID!=0)
{
dwTick = GetTickCount();
ep.dwProcessID = myProcessID;
////查找窗口句柄
while(!ep.hMainWnd && GetTickCount()-dwTick<2000)
{
EnumWindows((WNDENUMPROC)EnumWinProc,
(long)&ep);
if(ep.hMainWnd==NULL)
Sleep(1000);
}
if(ep.hMainWnd!=NULL)
bCreateProcssFlag = false;
}
if (bCreateProcssFlag&&CreateProcess(NULL,path.GetBuffer(path.GetLength()),
NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))
{
ep.dwProcessID = pi.dwProcessId;
myProcessID = pi.dwProcessId;
myProcessHandle = pi.hProcess;
dwTick = GetTickCount();
while(!ep.hMainWnd && GetTickCount()-dwTick<2000)
{
EnumWindows((WNDENUMPROC)EnumWinProc,
(long)&ep);
if(ep.hMainWnd==NULL)
Sleep(1000);
}
}
HWND hParent = ep.hMainWnd;
::ShowWindow(hParent,SW_RESTORE);
::SendMessage(hParent,WM_SHOWWINDOW,0,0);
::SetForegroundWindow(hParent);
return NULL;
}
//取得IE路径
CString getIEpath(){
HKEY hKEY;//定义有关的hKEY,在查询结束时要关闭
//打开与路径 data_Set相关的hKEY
LPCTSTR data_Set="SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\iexplore.exe";
CString m_strPath;
//访问注册表,hKEY则保存此函数所打开的键的句柄
long ret0=(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,data_Set,0,KEY_READ,&hKEY));
if(ret0!=ERROR_SUCCESS)//如果无法打开hKEY,则中止程序的执行
{
AfxMessageBox("error, can't open key!");
return "";
}
//查询有关的数据
LPBYTE path_Get=new BYTE[80];
DWORD type_1=REG_SZ;//定义数据类型
DWORD cbData_1=80;//定义数据长度
long ret1=::RegQueryValueEx(hKEY,"",NULL,&type_1,path_Get,&cbData_1);
if(ret1!=ERROR_SUCCESS)
{
AfxMessageBox("error, don't query key information!");
return "";
}
//显示信息
m_strPath=CString(path_Get);
delete[] path_Get;
//程序结束,关闭打开的hKEY
::RegCloseKey(hKEY);
return m_strPath;
}
分享到:
相关推荐
Java通过JNI调用C# DLL是一个跨平台、跨语言的技术实践,主要应用于需要利用Java的稳定性和C#的高性能场景。JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。C# ...
在这个“GMSSL的java调用(JNI库和调用实例).zip”压缩包中,我们主要探讨如何在Java环境中通过JNI(Java Native Interface)来调用GMSSL库,以便利用这些国密算法进行数据加解密和哈希运算。 首先,我们需要了解...
《Java程序中JNI的编程指南》是一本专为开发者编写的书籍,主要针对四种特定情况:复用已有的C/C++代码、自定义Java虚拟机、跨语言协作以及将Java虚拟机集成到C/C++程序中。JNI(Java Native Interface)自1997年...
在本案例中,Vjoy被用作Java程序通过JNI访问的硬件模拟器。 3. 游戏控制器编程: 游戏控制器编程是计算机编程的一个分支,涉及处理来自各种游戏输入设备(如键盘、鼠标、游戏手柄等)的事件。通过Vjoy,开发者可以...
安卓app开发之NDK入门教程,JAVA代码通过JNI接口调用NDK代码(C语言编写的linux android功能).zip
本示例DEMO将详细介绍如何在Java程序中通过JNI调用C++代码函数。 首先,我们需要理解JNI的工作原理。JNI提供了一种方式,让Java虚拟机(JVM)能够调用本地方法,这些方法可以是C、C++或者其他本地语言编写的。JNI...
通过JNI中的Invocation API,可以在本地应用程序中嵌入Java虚拟机 (JVM),从而使得程序员能够在本地代码中调用Java代码。 本教程将涵盖JNI最常见的两种应用场景:从Java程序调用C/C++代码以及从C/C++程序调用Java...
Java调用C源程序是通过Java Native Interface (JNI)实现的,这是一种允许Java代码和其他语言写的代码进行交互的标准机制。JNI在Java平台中扮演着重要角色,尤其在需要利用C或C++库、硬件接口或者优化性能的场景下。...
本篇将深入探讨如何在Delphi中通过JNI来调用Java函数。 首先,我们需要理解JNI的概念。JNI是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI接口提供了在本地代码中创建、访问和修改Java对象...
在这个场景中,Java程序会调用本地(native)方法来获取CPU利用率,这些本地方法通常是用C++或C编写,并通过JNI接口与Java代码集成。 首先,我们需要理解CPU利用率的概念。CPU利用率是指CPU在一段时间内处于忙碌...
Java再次探讨JNI(Java Native Interface)这一主题,其主要目的是为了解决Java语言与本地代码交互的问题。...通过学习这些实例,开发者可以进一步提升在Java中使用JNI的能力,解决特定问题并提升程序性能。
本文的标题“Java 通过 JNI 调用 C++ 的 DLL 文件”表明了文章的主要内容,即使用 JNI 将 Java 应用程序与 C++ DLL 文件集成。 描述解析 文章的描述提供了一个 Demo 文档,描述了如何使用 JNI 将 Java 应用程序与 ...
Java通过JNI(Java Native Interface)调用C语言函数库是一种常见的技术实践,它允许Java程序直接与本地操作系统和硬件交互,提高性能或者利用已有的C/C++代码库。本资料"Java通过JNI调用C语言函数库的方法.zip"提供...
Java通过JNI调用DLL动态库,亲测试编写
通过JNI,开发者可以在Java应用程序中调用C、C++甚至是其他语言编写的原生代码,反之亦然。在Delphi中调用Java函数,可以利用JNI提供的API来实现这一目标,从而扩展Delphi程序的功能。 首先,我们需要了解JNI的基本...
Java技术中的JNI(Java Native Interface)是Java平台标准的一部分,它允许...在Java程序中引入本地代码可以极大地扩展其功能,但同时也带来了更多的复杂性,因此理解和熟练掌握JNI是提高Java应用开发能力的重要一环。
例如与一些硬件设备通信,往往要花费很大的精力去设计流程编写代码去管理设备端口,而有一些设备厂商提供的硬件接口已经经过一定的封装和处理,不能直接使用 Java 程序通过端口和设备通信。在这种情况下就得考虑使用...
通过JNI,开发人员可以访问Java类中的本机方法,这在处理性能关键型操作或使用非Java库时特别有用。 #### 示例流程详解 在给定的文档中,我们看到的是一个简化的示例,演示如何在Java中使用JNI调用C/C++代码。下面...
本文旨在介绍 Java 和 C++ 之间的互相调用实例,通过 JNI(Java Native Interface)技术,实现 Java 调用 C++ 和 C++ 调用 Java 的操作。下面将对标题、描述、标签和部分内容进行详细说明。 标题:JNI 调用实例...