Java调用dll文件

article/2025/8/27 13:54:56

目录

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博客


http://chatgpt.dhexx.cn/article/yRwxl5ls.shtml

相关文章

什么是dll文件

动态链接库&#xff08;Dynamic Link Library 或者 Dynamic-link Library&#xff0c;缩写为 DLL&#xff09;&#xff0c;是微软公司在微软Windows操作系统中&#xff0c;实现共享函数库概念的一种方式。这些库函数的扩展名是 ”.dll"、".ocx"&#xff08;包含…

什么是dll

DLL的概念 DLL(Dynamic Link Library)文件为动态链接库文件&#xff0c;又称“应用程序拓展”&#xff0c;是软件文件类型。在Windows中&#xff0c;许多应用程序并不是一个完整的可执行文件&#xff0c;它们被分割成一些相对独立的动态链接库&#xff0c;即DLL文件&#xff0c…

XWiKi 部分汉化

一、进入XWiki首页&#xff0c;用管理员进行登陆 账号&#xff1a;superadmin 密码&#xff1a;system 登陆后点击右上角&#xff0c;如下图所示 二、点开管理页面 如下图所示&#xff1a; 三、搜索localization 四、按照图中进行修改 然后部分汉化就完成了 当然&#xff0c;如…

XWiKi 汉化

进入XWiKi主页&#xff0c;然后点击菜单栏&#xff0c;进入管理&#xff0c;汉化前图片显示&#xff1a; 汉化后图片显示 一、进入安装目录/xwiki/WEB-INF/lib/下找到xwiki-platform-legacy-oldcore-10.7.jar 二、用zip解压软件进入xwiki-platform-legacy-oldcore-10.7.jar不要…

xwiki开发指南1-使用XWiki创建FAQ应用

本文是按照XWiki官网开发指南-FAQ应用创建&#xff0c;自己翻译总结的版本。 此篇含有大量图片&#xff0c;关于XWiki的开发&#xff0c;将在下一篇讲解。 关于XWiki的部署也会单独写一篇基于docker的部署文。 使用XWiki创建FAQ应用 1.首先下载并部署XWiki&#xff08;之后会…

【Wiki】XWiki安装教程_War包版本

目录 0、XWiki说明1、war包安装说明1.1、环境说明1.2、如果懒得下载可以使用这边准备好的物料包汇总 2、war包安装2.1、Tomcat安装2.2、java安装(需要root权限)2.3 、使用 source /etc/profile 刷新linux配置2.4、数据库安装2.5、解压war包与xip2.6、修改配置文件2.6.1、修改WE…

xwiki搭建

一、Xwiki简介 XWiki是一个由Java编写的基于LGPL协议发布的开源wiki和应用平台。XWiki是一款基于java所编写的wiki&#xff0c;它可以运行在如Tomcat&#xff0c;Jetty&#xff0c;JBoss&#xff0c;WebLogic&#xff0c;WebSphere等Servlet容器上并利用关系型数据库(HS…

XWiki在Windows上部署

简单介绍 XWiki是一款Java开发的开源文档管理系统&#xff0c;它简单易用&#xff0c;拥有强大的权限管理功能。 部署条件 JDK11&#xff08;需要注意&#xff1a;14版本之后需要JDK11以上&#xff09;、Tomcat9&#xff0c;XWiki 部署过程 JDK和Tomcat的部署我就贴个参考链…

开源框架XWIKI搭建介绍

原文地址&#xff1a;http://john88wang.blog.51cto.com/2165294/1605787 一 应用背景描述 在平时的运维工作中&#xff0c;把常规工作进行文档整理非常重要&#xff0c;无论是平时工作处理或是工作交接&#xff0c;实时的维护文档资料可以提高工作效率。如果采用传统的TXT文档…

xwiki安装使用以及问题解决

环境要求&#xff1a; jdk1.8 安装步骤&#xff1a; xwiki的war包下载地址&#xff1a;https://www.xwiki.org/xwiki/bin/view/Download/DownloadVersion/?projectVersion10.11.2 第一步&#xff1a;在tomcat的webapps文件下创建xwiki文件夹&#xff0c;将war包上传至xwik…

CentOS 7安装XWiki

目录 前言 安装步骤 安装JDK 11 安装Tomcat 9 安装xwiki 13.10.10 安装Postgres 13 设置xwiki数据路径 参考 前言 本文介绍如何在CentOS 7安装xwiki。JDK 11 Tomcat 9 xwiki 13 Postgres 13。CentOS用vagrant虚拟化的。本文代码已开源 安装步骤 安装xwiki有四个主…

XWiki开发指南3-自定义扩展jar包

简介 本文将介绍如何编写一个提供给后台接口并使用脚本在前端页面调用。 使用maven下载XWiki提供的模板项目 保证你的maven已经安装&#xff0c;然后执行命令 mvn archetype:generate \-DarchetypeArtifactIdxwiki-commons-component-archetype \-DarchetypeGroupIdorg.xwi…

xwiki部署_开源Wiki应用平台---XWiki的部署

部署所需要做的工作&#xff1a; 1.安装好MySQL(这里使用的是MySQL5.6.23)&#xff0c;修改MySQL的my.ini配置文件(我的是手动安装版&#xff0c;所以在MySQL的安装目录 下)&#xff0c;在[mysqld]下添加以下配置&#xff1a; max_allowed_packet32M 这里是为了增大mysql serve…

XWIKI的搭建

原文地址&#xff1a;https://my.oschina.net/gywbest/blog/780569 一 应用背景描述 在平时的运维工作中&#xff0c;把常规工作进行文档整理非常重要&#xff0c;无论是平时工作处理或是工作交接&#xff0c;实时的维护文档资料可以提高工作效率。如果采用传统的TXT文档或者Wo…

xwiki部署_xwiki8.2.1安装部署

系统环境centos 6.5 实现方式&#xff1a;xwikinginxtomcatmysql 包获取&#xff1a;http://www.xwiki.org/xwiki/bin/view/Main/Download 版本&#xff1a;xwiki8.2.1 nginx 随意 jdk&#xff1a;必须1.8 tomcat&#xff1a;7或者以上 mysql&#xff1a;5.5或者以上 nginx、jd…

xwiki部署_Linux下Xwiki安装部署详解

一、Xwiki简介 XWiki是一个由Java编写的基于LGPL协议发布的开源wiki和应用平台。XWiki是一款基于java所编写的wiki&#xff0c;它可以运行在如Tomcat&#xff0c;Jetty&#xff0c;JBoss&#xff0c;WebLogic&#xff0c;WebSphere等Servlet容器上并利用关系型数据库(HSQL, MyS…

xwiki部署_xwiki 搭建心得

吐个槽可忽略 这几天不是接到个新活&#xff0c;要把 xwiki 融合到我们的项目里&#xff0c;于是我找到原来负责修改 xwiki 界面的同事&#xff0c;让他把代码给我。等我拿到手一看&#xff0c;我的内心几乎是崩溃的&#xff0c;竟然没有做代码版本控制&#xff0c;全部在初始文…

xwiki

下载war放到tomcat的webapps目录下&#xff1a; http://nexus.xwiki.org/nexus/content/groups/public/org/xwiki/platform/xwiki-platform-distribution-war/11.10.3/xwiki-platform-distribution-war-11.10.3.war 安装参考&#xff1a; https://juejin.im/post/5c1466d0f265…

xwiki使用指南

修改配置&#xff0c;启动超级管理员&#xff0c;启用默认语言。实现汉化&#xff0c;设置权限&#xff0c;禁止外部注册&#xff0c;设置邮箱激活&#xff0c;修改管理员密码&#xff0c;加入新用户。 1.启动超级管理员&#xff0c;编辑xwiki.cfg文件vim /usr/local/XWiki/web…

基于xwiki部署企业内部知识管理平台

1. Xwiki介绍 印象笔记、有道笔记、为知笔记都是挺好的商用笔记知识管理软件&#xff0c;不过有些敏感文件是不太好放到互联网上的。 所以搭建一套内部局域网知识管理平台是非常有意义的&#xff0c;在开源Wiki系统中&#xff0c;XWiki是做的最好的产品之一。因为它提供的功能…