目录

1 C++创建dll

1.1 项目与工具

1.2 步骤与代码

2 Java使用JNA调用dll

2.1 项目与工具

2.2 步骤与代码

3 实际效果

4 参考链接


1 C++创建dll

1.1 项目与工具

Visual Studio 2019

1.2 步骤与代码

①使用VS创建动态链接库(DLL)项目

②设置项目名与项目地址

创建好的效果如下:

③创建choosefiles.cpp源文件和choosefiles.h头文件

 ④choosefiles.h

#ifdef CHOOSEFILES_EXPORTS
#define CHOOSEFILES_API __declspec(dllexport)
#else
#define CHOOSEFILES_API __declspec(dllimport)
#endifextern "C" CHOOSEFILES_API char* chooseFiles();

⑤choosefiles.cpp

#include "pch.h"
#include "framework.h"
#include "choosefiles.h"
#include <iostream>
#include <windows.h>
#include <Commdlg.h>
#include <tchar.h>using namespace std;/*
TCHAR*转char*
*/
char* LPWSTR2LPSTR(LPWSTR lpwszStrIn)
{LPSTR pszOut = NULL;if (lpwszStrIn != NULL) {int nInputStrLen = wcslen(lpwszStrIn);int nOutputStrLen = WideCharToMultiByte(CP_ACP, 0, lpwszStrIn, nInputStrLen, NULL, 0, 0, 0) + 2;pszOut = new char[nOutputStrLen];if (pszOut != NULL) {memset(pszOut, 0x00, nOutputStrLen);WideCharToMultiByte(CP_ACP, 0, lpwszStrIn, nInputStrLen, pszOut, nOutputStrLen, 0, 0);}}return  pszOut;
}CHOOSEFILES_API char* chooseFiles() {OPENFILENAME ofn;TCHAR szOpenFileNames[80 * MAX_PATH] = { 0 };TCHAR szPath[MAX_PATH];TCHAR szFileName[80 * MAX_PATH];int nLen = 0;TCHAR* p = NULL;ZeroMemory(&ofn, sizeof(ofn));// 结构体大小ofn.lStructSize = sizeof(ofn);// 拥有着窗口句柄ofn.hwndOwner = NULL;// 接收返回的文件名,注意第一个字符需要为NULLofn.lpstrFile = szOpenFileNames;// 缓冲区长度ofn.nMaxFile = sizeof(szOpenFileNames);// _T可替换为TEXT,使用_T需要引tchar.hofn.lpstrFile[0] = _T('\0');// 设置过滤ofn.lpstrFilter = _T("All\0*.*\0.mp4\0*.mp4\0.avi\0*.avi\0.mkv\0*.mkv\0.rmvb\0*.rmvb\0.f4v\0*.f4v\0.flv\0*.flv\0.m4v\0*.m4v\0.mpg\0*.mpg\0\0");// 过滤器索引ofn.nFilterIndex = 1;// 窗口标题ofn.lpstrTitle = _T("请选择视频");// 文件必须存在、允许多选、隐藏只读选项、对话框使用资源管理器风格的用户界面// 官方文档:https://docs.microsoft.com/en-us/windows/win32/api/commdlg/ns-commdlg-openfilenameaofn.Flags = OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT | OFN_HIDEREADONLY | OFN_EXPLORER;// 定义字符串,用于拼接所选的所有文件的完整路径string str = "***";// 如果打开文件失败,则不操作;打开成功才操作if (GetOpenFileName(&ofn)) {// 把第一个文件名前的复制到szPath,即:  // 如果只选了一个文件,就复制到最后一个'/'  // 如果选了多个文件,就复制到第一个NULL字符  lstrcpyn(szPath, szOpenFileNames, ofn.nFileOffset);// 当只选了一个文件时,下面这个NULL字符是必需的.  // 这里不区别对待选了一个和多个文件的情况szPath[ofn.nFileOffset] = '\0';nLen = lstrlen(szPath);// 如果选了多个文件,则必须加上'//'  if (szPath[nLen - 1] != '\\') {lstrcat(szPath, _T("\\"));}// 把指针移到第一个文件  p = szOpenFileNames + ofn.nFileOffset;// 对szFileName进行清零ZeroMemory(szFileName, sizeof(szFileName));while (*p) {// 读取文件名string fileName = LPWSTR2LPSTR(p);// 读取文件所在文件夹路径string filePath = LPWSTR2LPSTR(szPath);// 拼接文件完整路径string completePath = filePath + fileName;// 拼接字符串str += completePath + "***";//移至下一个文件p += lstrlen(p) + 1;}}// 将string转为char*char* strc = new char[strlen(str.c_str()) + 1];const char* cc = str.c_str();strcpy_s(strc, str.size() + 1, cc);return strc;
}

⑥改成64位程序(由于我使用的是64位的jdk,所以需要生成64位的dll)

⑦生成解决方案

生成成功提示如下:

dll文件:

2 Java使用JNA调用dll

2.1 项目与工具

idea、maven(选择maven-archetype-quickstart骨架)、Java8、JNA

2.2 步骤与代码

①创建好项目之后,创建resources文件夹,并将dll文件复制进去

②设置项目资源文件夹

设置好后结果如下:

③添加jna依赖并刷新maven

<!-- https://mvnrepository.com/artifact/net.java.dev.jna/jna -->
<dependency><groupId>net.java.dev.jna</groupId><artifactId>jna</artifactId><version>5.5.0</version>
</dependency> 

④创建DLL接口

package cxzgwing;import com.sun.jna.Library;
import com.sun.jna.Native;public interface DLL extends Library {DLL dll = Native.load("choosefiles", DLL.class);String chooseFiles();
}

⑤调用

package cxzgwing;public class App {public static void main(String[] args) {System.setProperty("jna.encoding", "GBK");System.out.println(DLL.dll.chooseFiles());}
}

3 实际效果

若点击取消,则输出三个星号(***):

可选择显示的文件类型:

4 参考链接

[1] Aimls.Java使用JNA调用C/C++动态链接库dll.2019-07-26 14:44:22

Java使用JNA调用C/C++动态链接库dll_哔哩哔哩_bilibili

[2] 晨曦之光Wing.C++打开文件选择框多选文件.2021-10-09 00:03:40

C++打开文件选择框多选文件_晨曦之光Wing的博客-CSDN博客

Java调用dll文件相关推荐

  1. 关于java调用Dll文件的异常 %1 不是有效的 Win32 应用程序。

    关于java调用Dll文件的异常 %1 不是有效的 Win32 应用程序. 参考文章: (1)关于java调用Dll文件的异常 %1 不是有效的 Win32 应用程序. (2)https://www. ...

  2. 关于java调用Dll文件的异常 Native library (win32-x86-64/CtrlNPCDLL.dll) not found in resource pat

    关于java调用Dll文件的异常 Native library (win32-x86-64/CtrlNPCDLL.dll) not found in resource pat 参考文章: (1)关于j ...

  3. 关于Java调用dll文件的一系列问题(持续更新)

    最近做项目,需要调用dll库,出现了一些问题,此处记录下,以免再踩坑. 报Unable to load library 'xxx.dll', 等错误 1.将你要用到的dll库放到 "C:\W ...

  4. JAVA 调用 DLL 文件 TSCLIB.DLL TSC打印机

    这是一段JAVA调用TSC条码打印机的代码:有详细的注释! 1,需要把dll文件拷贝到c:\windows\system32目录下 2,工程里面需要加载JNative.jar包(网上很多下载的) /* ...

  5. java调用Dll文件报“%1 不是有效的 Win32 应用程序”

    jdk的版本必须是32位,在电脑环境变量中修改:. MyEclipse使用的jdk必须是32位的,配置在第一步中jdk的路径:这两个缺一不可,缺少了会报"%1 不是有效的 Win32 应用程 ...

  6. java如何利用JNative调用dll文件

    下文参考自:http://blog.163.com/wex660@126/blog/static/2415306520103142363964/ 因为项目需要,用到了java调用dll文件中的方法.写 ...

  7. jar调用dll文件提示找不到指定的模块Unable to load library

    目录 问题描述 解决方案一 解决方案二 效果 补充说明 参考链接 问题描述 在Windows系统上,自己开发的需要使用JNA调用动态链接库dll文件的Swing项目(Java简易系统监视器system ...

  8. java jni dll路径_Java中Jni调用DLL文件试验

    Java中Jni调用DLL文件试验 下面是小编整理的Java中Jni调用DLL文件试验内容,希望可以为您带来帮助!更多内容请关注应届毕业生考试网! 所有文件均在E:\路径下. 安装jdk1.6.0_0 ...

  9. java中调用dll文件的两种方法

    https://www.cnblogs.com/huozhong/p/5830485.html JNA地址:http://blog.csdn.net/shendl/article/details/35 ...

  10. Java 调用Dll

    Java 中怎么能调用到dll中的函数呢? 关键是java中生的本地函数名參数和dll中的本地函数名參数一模一样. 这个程序是java中调用dll中的求和函数. 一,java代码部分操作 1.新建pr ...

最新文章

  1. ViewPager实现翻页步骤
  2. Mybatis: 返回不同实体(对象数组)
  3. hdu 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 (背包问题)
  4. C++ 术语(C++ Primer)
  5. python打包工具 --- pyinstaller
  6. c++ (QT)笔记
  7. 2016可信云大会进入倒计时 顶级“参会攻略”强势来袭
  8. 【EOS】2.2 发行Token,转移Token
  9. 20200203_knn分类算法
  10. 如何提高BT的下载速度?
  11. 从3D ToF到智能座舱系统方案,英飞凌如何赋能未来出行?
  12. cmake:指定find_package的搜索路径
  13. HanLP《自然语言处理入门》笔记--1.新手上路
  14. python 听歌识曲_听歌识曲--用python实现一个音乐检索器
  15. 优雅地封装和使用 ViewBinding,该替代 Kotlin synthetic 和 ButterKnife 了
  16. CAD打印文字不显示怎么办
  17. 摩登家庭第一季第一集剧本 侵删谢谢
  18. iOS开发-invalid nib registered for identifier (Cell) - nib must contain exactly one top level object
  19. 4.0 树莓派做下位机播放视频、控制电机舵机、超声波检测、paj7620手势传感器控制,树莓派串口通信等程序分析
  20. 【C语言中清空文件的方法】

热门文章

  1. 比PS更简单好用的自动抠图软件 一键抠图工具
  2. java项目tkmybatis整合_springboot集成tk mybatis
  3. tkmybatis能连接oracle吗,《放弃Mybatis使用tkMybatis》
  4. python中dateutil库用法详解
  5. Teststand中那些和LabVIEW里不一致的让人疑惑的规则
  6. TIBCO Spotfire使用技巧:如何使Spotfire表或散点图中呈现链接中图片
  7. HTML5浏览器测试网站汇总
  8. 【Unity项目实战】手把手教学:飞翔的小鸟(1)导入素材
  9. Gradle使用maven仓库
  10. win11 edge怎么卸载?win11 edge浏览器彻底卸载的方法教程