Dynamic Linking Error: Win32 Error 126问题排查

2023-05-16

    如题所示,这个问题是我在electron项目中使用ffi调用动态链接库出现的,本机运行都好好的,打包构建然后放到别的机器上运行出错。

    这个问题一度也让我很迷茫,如果是路径导致的这个问题,那么把路径指定正确就可以了,但是偏偏路径也是对的,就是报错。那应该是环境问题。

    我为什么要使用ffi调用动态链接库?我的需求是这样的,需要编程实现tcpip方式连接诺德施瓦茨仪表设备cmw500,其实就是visa编程了,我开始通过c语言简单实现了这个功能,以为万事大吉了,然后写了一个动态链接库,让electron项目去调用,因为node方面对visa操作的很少,网上唯一可以搜到的一个链接就是github上的这个:https://github.com/petertorelli/ni-visa。我当时没有细看,也不确定这个方式可不可靠。

    自己写的动态链接库代码:

    pch.h

#ifdef PCH_H
#else 
#define PCH_H extern "C" _declspec(dllimport)

// add headers that you want to pre-compile here
#include "framework.h"

#endif //PCH_H
PCH_H void QueryMeasureResult(char* source,char* cmd,char* result);

    pch.cpp

// pch.cpp: source file corresponding to the pre-compiled header
#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE)
#define _CRT_SECURE_NO_DEPRECATE
#endif
#define PCH_H extern "C" _declspec(dllexport)
#include "pch.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "visa.h"
static ViSession defaultRM;
static ViSession instr;
static ViUInt32 retCount;
static ViUInt32 writeCount;
static ViStatus status;
static unsigned char buffer[100];
static char stringinput[512];
// When you are using pre-compiled headers, this source file is necessary for compilation to succeed.
void QueryMeasureResult(char* source,char* cmd,char* result) {
	status = viOpenDefaultRM(&defaultRM);
	if (status < VI_SUCCESS) {
		viClose(defaultRM);
		strcpy(result, "error");
		return;
	}
	status = viOpen(defaultRM, source,VI_NULL, VI_NULL, &instr);
	if (status < VI_SUCCESS) {
		viClose(defaultRM);
		strcpy(result, "error");
		return;
	}
	status = viSetAttribute(instr, VI_ATTR_TMO_VALUE, 5000);
	status = viSetAttribute(instr, VI_ATTR_ASRL_BAUD, 4800);
	status = viSetAttribute(instr, VI_ATTR_ASRL_DATA_BITS, 8);
	status = viSetAttribute(instr, VI_ATTR_ASRL_PARITY, VI_ASRL_PAR_NONE);
	status = viSetAttribute(instr, VI_ATTR_ASRL_STOP_BITS, VI_ASRL_STOP_ONE);
	status = viSetAttribute(instr, VI_ATTR_TERMCHAR_EN, VI_TRUE);
	status = viSetAttribute(instr, VI_ATTR_TERMCHAR, 0xA);
	strcpy(stringinput, cmd);
	status = viWrite(instr, (ViBuf)stringinput, (ViUInt32)strlen(stringinput), &writeCount);
	if (status < VI_SUCCESS) {
		viClose(defaultRM);
		strcpy(result, "error");
		return;
	}
	status = viRead(instr, buffer, 100, &retCount);
	if (status < VI_SUCCESS) {
		strcpy(result, "error");
	}
	else {
		//buffer = "0,2.415445E+001"
		strcpy(result, (const char*)buffer);
	}
	viClose(defaultRM);
}

    后来呢,使用自己编译的动态库操作visa,可以实现,而且本机开发环境没有问题,然后非常高兴的就以为这个问题解决了,打包,后来测试就出了问题,总是报如题所示的错误。

    我的这段代码主要是使用visual studio 2017编译的,当时用c语言测试和node测试都没有问题。

    visatest.js

var ffi = require("ffi")
var ref = require("ref")
var path = require("path")
var dllpath = path.resolve(__dirname,"visademo.dll")
console.log(dllpath)
const api = new ffi.Library(dllpath,{
    QueryMeasureResult:["void",["string","string","string"]]
})
var source="TCPIP0::192.168.253.13::inst0::INSTR";
var cmd = "FETCh:GPRF:MEAS:POWER:PEAK:MAXimum?\n";
var result=Buffer.alloc(100);
result.type = ref.types.char;
api.QueryMeasureResult(source,cmd,result);
var str = result.readCString()
var arr = str.split(",");
var maximum  = arr[1]
console.log(parseFloat(maximum),maximum)

    /以上是我的代码和问题描述部分//

    我以为是因为我的代码本身调用了visa库,如果它不用调用其他库,简单的动态链接库是不是就不会出现这个问题呢?实际上,我同样使用visual studio 2017编译,本机检查都没有问题,放到别的机器上就出问题了。看来问题就出在环境上。

    后来偶然看到一个论坛上说,需要通过npm安装windows-build-tools,我试着在别的机器上安装,发现果然就不再报错了。

    但是这么一来,只要是动态链接库调用,都需要在别的机器上安装这个东西,似乎太扯淡了,其实electron+ffi现在这么成熟了,不可能编写的程序最后还需要在运行机器上再安装一个windows-build-tools。

    其实windows-build-tools安装,本质需要安装一个msbuild,同时安装了python,windows10 sdk,cmake等工具,而windows-build-tools需要下载vs_BuildTools.exe,并启动安装,其实就是使用visual studio install的安装,如果你安装过visual studio 2017的话,对这个非常熟悉。我的环境里面,需要安装上cmake,同时cmake又依赖windows10 sdk,而这个玩意就有2.4G这么大,所以别的系统上如果需要运行不报错的electron+ffi程序,还需要安装大概3G的环境,有些不切实际。

    后来,我又看了一遍前面提到的node环境下操作visa的项目,其实它借助了nivisa1850full安装之后,在系统中生成的visa64.dll依赖库,同样是操作动态链接库,这个项目还有6颗星,我觉着可以一试,抱着试试看的态度,最后发现可以。

    而且别的机器不用安装windows-build-tools环境也可以运行,但是别的机器需要安装nivisa依赖环境,这个是需要操作诺德施瓦茨仪表的。

    比较意外的是,我自己也写了一个动态库,在命令行下编译,没有使用visual studio 2017 ide工具编译,最后打包,在别的机器上使用也没有问题。

    我断定,我的动态链接库调用的问题是出在使用visual studio 2017 ide工具编码编译,至于为什么,我现在还没有搞清楚。我使用命令行编译,其实也是使用的visual studio 2017安装生成的开发人员编译工具,竟然就没有问题。

    

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dynamic Linking Error: Win32 Error 126问题排查 的相关文章

  • 如何在浏览器的调试器本身中调试动态加载的 JavaScript(使用 jQuery)?

    动态添加的脚本不会显示在浏览器调试器的脚本部分中 解释 我需要使用并且已经使用过 if someCondition true getScript myScirpt js function alert Load Complete myFunc
  • 向 ExpandoObject 添加与字符串同名的属性

    有没有办法向 ExpandoObject 添加与字符串值同名的属性 例如 如果我有 string propName ProductNumber dynamic obj new System Dynamic ExpandoObject 我可以
  • 如何根据 iPhone 中的文本大小动态增加按钮宽度?

    我以编程方式创建了 10 个按钮 并在按钮中设置了标题 现在我想动态增加按钮框架大小 它取决于文本 我给出了一些条件并设置了框架大小 但我如何设置确切的帧大小取决于文本 动态获取文本 我的示例代码是 float x 0 y 0 w h 20
  • 如何更改 selectize.js 下拉列表的占位符?

    当父下拉列表更改其选择以加载要更改占位符的下拉列表的选项时 我想更改由 selectize js 创建的下拉列表的占位符 文档中没有提供执行此操作的方法 您可以指定一个placeholder初始化时将 key 作为选项对象的一部分 我在文档
  • 反思 ExpandoObject

    我写了一个漂亮的函数 它将接受system object 反映其属性并将对象序列化为 JSON 字符串 它看起来像这样 public class JSONSerializer public string Serialize object o
  • Android UI - 动态添加按钮到 Gridview

    这就是我现在陷入困境的地方 我一直坚持向 gridview 动态添加按钮 我的 gridview 带有一个按钮 当用户单击该按钮时 会弹出上下文菜单 要求用户输入信息 完成后 使用该信息创建网格视图中的块 如图所示 我已经粘贴了代码 我不知
  • 将按钮数组添加到 Android 应用程序中的 GridView

    我的应用程序将有 5 15 个按钮 具体取决于后端可用的内容 如何定义正确的 GridView 布局文件以包含一组按钮 每个按钮都有不同的文本和其他属性 每个按钮本质上都会将一个商品添加到购物车 因此除了添加到购物车的商品之外 onClic
  • Linq to SQL 中的动态表名称

    大家好 我有一个可怕的数据库 我必须使用它 而 linq to sql 是我用来检索数据的选项 我试图通过根据用户选择输入不同的表名称来重用函数 但据我所知 无法修改 DataContext 查询中的 TEntity 或 Table 这是我
  • 为什么尝试使用动态参数调用扩展方法时出现错误 CS1973

    考虑以下代码 internal static class Program public static string ExtensionMethod this string format dynamic args return format
  • 从 PHP 中具有动态类名的类获取静态属性

    我有这个 一个保存类名的字符串变量 classname 一个字符串变量包含属性名称 propertyname 我想从该类获取该属性 问题是 该属性是静态的 我不知道该怎么做 如果该属性不是静态的 则它将是 classname gt prop
  • 为什么 ASP.NET Dynamic 控件即使添加到 Page_Load 中也能保留 ViewState?

    我做了一些与动态控件和 ViewState 相关的研究 我读到 为了保留动态控件的 ViewState 您必须将其添加到 Page Init 事件中 这是有道理的 因为 PageLifeCycle 是 初始化 加载视图状态 加载回发数据 L
  • 如何在 JavaScript 中一次出现一个测验问题

    这里是 JavaScript 菜鸟 我正在尝试制作一个正在开发的测验应用程序 但我真的不知道如何继续 我把所有的问题都用html写出来了 情况是这样的 这个测验没有正确答案 只有答案值 该代码应该将每个问题的所有值相加 并根据累积的总分在最
  • 如何在滚动 iPhone 上向 tableview 添加元素?

    我正在使用 UITableView 列出来自 Web 服务的元素 我需要做的是首先从Web服务调用20个元素并显示在列表中 当用户向下滚动时从Web服务调用另外20个记录并添加到表格视图 这个怎么做 您可以从 Web 服务加载 20 个项目
  • 依靠 IEnumerable

    我正在使用 Rob Conery 的 Massive ORM 有没有一种优雅的方法来对返回的记录集进行计数 dynamic viewModelExpando result ViewData Model var queryFromMassiv
  • 动态 PayPal 按钮生成 - 这不是很不安全吗?

    我只是想知道 PayPal 按钮不是动态创建的 非常不安全并且很容易被 破解 吗 Like so
  • BeautifulSoup 不抓取动态内容

    我遇到的问题是我想从此页面获取相关链接 http support apple com kb TS1538 http support apple com kb TS1538 如果我在 Chrome 或 Safari 中检查 Element 我
  • 运行时动态转换

    有没有一种方法可以在运行时动态转换 如以下伪代码 foreach DataRow row in table Rows foreach DataColumn col in table Columns if row col DBNull Val
  • 如何使用 Tkinter 创建自动更新的 GUI?

    from Tkinter import import time Tkinter stuff class App object def init self self root Tk self labeltitle Label root tex
  • Android 动态添加联系表单

    Hi 我想实现如图所示的表单 不知道他们如何动态添加字段 这是列表视图吗 可扩展列表 用户可以在运行时添加和删除 我已经检查了包含子项目的可扩展列表 但我们在数组中定义子元素 在图像中它们动态添加 任何指南 链接 Thanks Custom
  • 如何使用 PHP 创建动态页面标题

    大家好 我想知道是否有人可以帮助解决这个 PHP 问题 是否可以使用 H2 标记中的文本并使用它来动态填充页面标题 我还希望能够使用相同的技术将 H2 文本添加到元描述中 有人可以帮忙吗 如果您的 h2 文本是动态创建的 那么网页的其他部分

随机推荐

  • truffle+ganache-cli构建简单以太坊智能合约并编译部署

    以前接触过以太坊工具链来做区块链练手项目 xff0c 后来荒废了 xff0c 如今再次捡起来 xff0c 算是回忆和加深 之前可能因为网络的原因 xff0c 在truffle各种初始化编译合成智能合约都遇到了好多问题 xff0c 如今再次尝
  • docker-compose搭建mongo+elasticsearch+graylog运行环境

    graylog是一个小型的开源日志收集 分析 展示框架 主要graylog运行需要mongo elasticsearch xff0c 所以他们就组成了一个小的整体 一般在虚拟机上搭建 xff0c 可以分开安装部署 xff0c 但是既然是一个
  • word文档中插入图片显示不全解决办法

    在windows下写word文档 xff0c 正常情况下 xff0c 我们应该不会遇到插入图片显示不全的问题 xff0c 好像是如果在已有的文档中插入图片 xff0c 比如文档中间插入 xff0c 图片没办法自动扩展空间 xff0c 这就导
  • quasar构建linux版本electron项目以及如何让electron程序在linux下运行

    quasar构建 xff0c 默认命令是 xff1a quasar build m electron 如果要支持linux xff0c 通常是直接加参数 target linux或者简写 T linux quasar build m ele
  • docker容器改变时区

    默认情况下的docker容器启动之后 xff0c 系统时间是UTC时间 xff0c 这导致和我们的北京时间相差8小时 xff0c 会引出很多问题 有一些容器是和项目一起构建的 xff0c 我们可以在构建的时候 xff0c 将系统时区修改为A
  • elasticsearch加入中文分词器elasticsearch-analysis-ik插件

    前言 elasticsearch作为一个分布式弹性存储与检索系统 xff0c 默认是不支持中文分词的 xff0c 但是呢 xff0c 这个工作有人做 xff0c 估计都是中国人做的吧 什么是中文分词呢 xff0c 简单来说 xff0c 就是
  • c语言自定义tcp协议实现socket通信

    一般的tcp协议示例 xff0c 大家给出的demo都是类似一个helloworld的示例 xff0c 简单罗列了socket建立 xff0c 创建连接 xff0c 发送数据 xff0c 关闭连接的过程 xff0c 实际上tcp通信确实也就
  • c语言自定义tcp协议实现socket通信(windows版本)

    前面一篇博客介绍了mac linux下通过C语言自定义协议实现socket通信的示例 xff0c 因为大部分api与windows还有很多区别 xff0c 这里就特意把windows下的tcp通信实例给介绍一下 无论是linux xff0c
  • macos升级体验

    周末在家里把macos从10 11 6版本升到了10 14 6版本 xff0c 其中的过程基本大同小异 后面想继续升级 xff0c 发现遇到了问题 网上有的说需要一步一步来升级 xff0c 如果是10 11 xff0c 需要先升级到10 1
  • xcode开发c语言开启多target

    xcode开发c语言 xff0c 在选择project template时选择command line tool xff0c 后面填入product name xff0c 最后选择存储位置就可以了 但是一般而言c语言项目只有一个main函数
  • vaex 将csv转换为hdf5

    I have a massive CSV file which I can not fit all into memory at one time How do I convert it to HDF5 We are working to
  • ubuntu1804源码编译jdk8

    这里纯粹自己弄着玩 xff0c 因为以前没有成功过 xff0c 这里记录一下 xff0c 就是让遇到问题的人可以规避问题 xff0c 快速编译自己的jdk 相信很多学java的人都看过或者了解过一本书 深入理解java虚拟机 xff0c 里
  • vmware安装minix并开启x11

    最近突然想弄一下minix这个老牌的系统 vmware安装minix3虚拟机 xff0c 其实很简单的 xff1a 1 新建虚拟机 xff0c 选择经典 2 选择客户机操作系统 xff1a 其他 xff0c 版本 xff1a 其他 64位
  • minix3通过pkgin_cd安装二进制包

    在安装完minix3虚拟机之后 xff0c 如果要进行其他工具的安装 xff0c 默认需要借助pkgin xff0c 这个需要先更新 pkgin up xff0c 然后安装各种可以被下载的包 本人试了几次之后 xff0c 发现pkgin i
  • clang: error: unable to execute command: Executable “ld“ doesn‘t exist!

    如题所示 xff0c 我在minix3中直接安装了clang xff0c 然后使用如下命令编译c程序报错 clang hello c o hello clang error unable to execute command Executa
  • c语言结构体内存对齐问题

    c语言中结构体使用是非常广泛的 xff0c 但是结构体有一个问题 xff0c 就是如果开头的字段属性是字符类型 char xff0c 紧跟着的是其他类型 xff0c 比如整型 长整型 双精度 浮点型 xff0c 这时候结构体的大小会发生改变
  • java通过jni调用native method

    jdk中规定了native method xff0c 每一个native method背后对应有一个动态链接库来支持它 xff0c 在windows系统上 xff0c 就是dll后缀的文件 native method是需要通过c c 43
  • minix3下安装libevent

    libevent是一个c语言编写的事件框架 xff0c 支持异步IO 定时器 信号事件 它支持跨平台 xff0c 大部分都是在linux下安装并使用 xff0c 今天介绍在unix系统minix3上的安装 minix3上编译环境是clang
  • win10启动命令行之前执行命令

    这个问题的引出 xff0c 是我在win10上设置cmd命令行字体的问题 xff0c 我之前在win7上设置过cmd终端命令行字体 xff0c 通过更改注册表 xff0c 然后设置想要的字体 xff0c 就可以达到效果 xff0c 可是在w
  • Dynamic Linking Error: Win32 Error 126问题排查

    如题所示 xff0c 这个问题是我在electron项目中使用ffi调用动态链接库出现的 xff0c 本机运行都好好的 xff0c 打包构建然后放到别的机器上运行出错 这个问题一度也让我很迷茫 xff0c 如果是路径导致的这个问题 xff0