《Java深度历险》的第一个JNI小程序的Visual C++实现

《Java深度历险》第3章“Java与MS Office”,实际上讲的是如果用Java本地界面JNI写程序,即Java应用程序调用其它语言写的.dll库。 该书写于十余年前,用C++Builder写的示例dll库。把第3章第一个样例用现在的Visual C++ 2013实现一下,还是必要的。要点如下:


1. 我发现Visual C++ 2013新建项目竟然没有.dll项目!弄了半天才明白应该是新建Win32项目,然后下一步,可以选择是Win32还是Win32Console还是DLL等,这样就可以自动生成一个标准的C++ dll项目了。


2. 下述代码实现了《Java深度历险》第3章第86页的dll的主要函数的代码。说明两点:

2.1 使用Windows SDK的GetOpenFileName调用,必须要显式包含Commdlg.h。 即使windows.h已经包含了,仍然显示找不到GetOpenFileName等符号。咄咄怪事。

2.2 两个字符串用+连接,编译不过去。只好定义了C++的string型变量。

还好,最后测试通过。说明Java的向前兼容做得很好,十年前的jdk1.3到现在的jdk1.8,完全没问题。


#include "stdafx.h"
#include  <io.h>
#include <Commdlg.h>
#include <string>


JNIEXPORT void JNICALL Java_com_sun_edu_JavatoWord_NativeToWord
(JNIEnv *env, jobject obj, jobjectArray context, jint count)
{
	OPENFILENAME ofn;
	char strFile[MAX_PATH];
	memset(&ofn, 0, sizeof(OPENFILENAME));
	memset(strFile, 0, sizeof(char)*MAX_PATH);
	ofn.lStructSize = sizeof(OPENFILENAME);
	ofn.lpstrFilter = "Word files (*.doc)\0*.doc*\0";
	ofn.lpstrFile = strFile;
	ofn.nMaxFile = MAX_PATH;
	ofn.Flags = OFN_FILEMUSTEXIST;
	if (GetOpenFileName(&ofn))//strFile得用户所选择文件路径和文件名 
	{
		//PathStripPath(strFile);//strFile得文件名
	}

 
	//檢查樣板檔是否存在
	if ((_access(strFile, 0)) == -1)
	{
		MessageBox(NULL, "您所輸入的檔案並不存在,請重新輸入", "", MB_OK);
		 
		return;
	}

	std::string ss = "您選擇的檔名為";
	ss += strFile;
	MessageBox(NULL, ss.c_str(), "", MB_OK);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值