- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我目前正在尝试使用某个 SDK,它可以让我从供应商提供的 DLL 中加载函数。我必须将参数传递给这些函数,而 DLL 会完成所有工作。
现在,DLL 应该正在与另一个设备通信,而我只是等待结果。但是,我没有此设备,那么如何设置模拟界面来模拟该设备?
为了清楚起见,这里有一个例子:
myfuncpointer.Open(someparam,anotherparam,...);
现在,因为我没有设备,DLL实际上不能执行上面的功能;它失败。我如何设置测试以便 DLL 与我设计的类而不是设备对话?有什么方法可以重定向 DLL 的调用吗?
我如何创建 DummyDevice 类来执行此操作?
谢谢..
附言如果有任何不清楚的地方,请不要太快投反对票。请评论我需要解释的内容,我会尽力解决。谢谢。
编辑:然而,我所拥有的是一个规范表,其中包含所有使用的数据结构以及它必须包含的预期/合法值。例如,如果我调用一个函数:
myfuncpointer.getinfo(param,otherparam);
其中一个参数是 DLL 在查询设备后用信息填充的数据结构(例如,如果启用了某个选项)。我可以这样做
param.option = true;
在它完成 getinfo 调用之后。
这是测试代码的好方法吗?欺骗这个 DLL 使其思考所有错误的事情似乎非常非常危险,而且似乎真的很难扩展,即使只是一点点..
最佳答案
在您获得硬件之前,模拟设备访问是否是一种权宜之计?如果是这样,我建议寻找其他提高工作效率的方法:处理其他事情、编写单元测试等。
访问模拟设备是否是一项永久性要求?如果是这样,您可以采取以下几种方法:
如果其他供应商的 SDK 具有“模拟”或“模拟”模式,请使用它。您可能会感到惊讶。您可能不是唯一需要能够在没有安装其他供应商硬件的情况下测试/运行其应用程序的客户。
将其他供应商的代码排除在外。仅模拟您的应用程序需要的功能,并以您的程序要求为基础。一切尽在您的掌控之中。
一个。 添加一个间接层。使用多态性在两种实现之间切换:一种调用其他供应商的 DLL,另一种模拟其行为。让您的代码调用抽象基类而不是直接调用其他供应商的 DLL 也将使您更容易为代码编写单元测试。
编写一个模拟 DLL(正如 Adam Rosenfield 所建议的那样)。您需要准确匹配函数名称和调用约定。当您升级到其他供应商的 DLL 的新版本时,您将需要扩展模拟 DLL 以支持您的应用程序使用的任何新入口点。
如果您需要选择在运行时使用哪个 DLL,这可能需要转换您的代码以动态加载 DLL(但听起来您可能已经在这样做了,因为您说过一些关于函数指针的内容)。您可以在安装时决定是安装其他供应商的 DLL 还是模拟 DLL。如果这纯粹是为了测试目的,您可以在编译时选择要使用的 DLL,然后只构建您的应用程序的两个版本。
编写模拟设备驱动程序(按照其他人的建议)。
如果您有其他供应商的用户模式 DLL 和他们的设备驱动程序之间的接口(interface)规范,这可能是可行的。它可能会比任何其他方法花费更长的时间,即使您是一位经验丰富的设备驱动程序开发人员,尤其是如果您没有其他供应商的 DLL 的源代码。 UMDF(用户模式驱动程序框架)可能会稍微简化或减少耗时。
如果您提到的规范没有描述用户/内核接口(interface),您将需要对该接口(interface)进行逆向工程。与其他选项相比,这可能不会有效地利用您的时间,特别是如果驱动程序接口(interface)很复杂(例如,它将大量复杂的数据结构传递给 DeviceIoControl()
)。
在这两种情况下,每次升级到其他供应商的 SDK 的新版本时,您都需要重新访问它。相同的导出 DLL 函数可能需要使用新的 DeviceIoControl()
代码和结构。
关于c++ - 在 C++ 中设置模拟接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/580342/
我需要将文本放在 中在一个 Div 中,在另一个 Div 中,在另一个 Div 中。所以这是它的样子: #document Change PIN
奇怪的事情发生了。 我有一个基本的 html 代码。 html,头部, body 。(因为我收到了一些反对票,这里是完整的代码) 这是我的CSS: html { backgroun
我正在尝试将 Assets 中的一组图像加载到 UICollectionview 中存在的 ImageView 中,但每当我运行应用程序时它都会显示错误。而且也没有显示图像。 我在ViewDidLoa
我需要根据带参数的 perl 脚本的输出更改一些环境变量。在 tcsh 中,我可以使用别名命令来评估 perl 脚本的输出。 tcsh: alias setsdk 'eval `/localhome/
我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Ra
这是我的方法 void login(Event event);我想知道 Kotlin 中应该如何 最佳答案 在 Kotlin 中通配符运算符是 * 。它指示编译器它是未知的,但一旦知道,就不会有其他类
看下面的代码 for story in book if story.title.length < 140 - var story
我正在尝试用 C 语言学习字符串处理。我写了一个程序,它存储了一些音乐轨道,并帮助用户检查他/她想到的歌曲是否存在于存储的轨道中。这是通过要求用户输入一串字符来完成的。然后程序使用 strstr()
我正在学习 sscanf 并遇到如下格式字符串: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); 我理解 %[^:] 部分意味着扫描直到遇到 ':' 并将其分配给 a。:
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
我有一种情况,我想将文本文件中的现有行包含到一个新 block 中。 line 1 line 2 line in block line 3 line 4 应该变成 line 1 line 2 line
我有一个新项目,我正在尝试设置 Django 调试工具栏。首先,我尝试了快速设置,它只涉及将 'debug_toolbar' 添加到我的已安装应用程序列表中。有了这个,当我转到我的根 URL 时,调试
在 Matlab 中,如果我有一个函数 f,例如签名是 f(a,b,c),我可以创建一个只有一个变量 b 的函数,它将使用固定的 a=a1 和 c=c1 调用 f: g = @(b) f(a1, b,
我不明白为什么 ForEach 中的元素之间有多余的垂直间距在 VStack 里面在 ScrollView 里面使用 GeometryReader 时渲染自定义水平分隔线。 Scrol
我想知道,是否有关于何时使用 session 和 cookie 的指南或最佳实践? 什么应该和什么不应该存储在其中?谢谢! 最佳答案 这些文档很好地了解了 session cookie 的安全问题以及
我在 scipy/numpy 中有一个 Nx3 矩阵,我想用它制作一个 3 维条形图,其中 X 轴和 Y 轴由矩阵的第一列和第二列的值、高度确定每个条形的 是矩阵中的第三列,条形的数量由 N 确定。
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我怀疑该值如何存储在“WORD”中,因为 PStr 包含实际输出。? 既然Pstr中存储的是小写到大写的字母,那么在printf中如何将其给出为“WORD”。有人可以吗?解释一下? #include
我有一个 3x3 数组: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; 并想获得它的第一个 2
我意识到您可以使用如下方式轻松检查焦点: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(win
我是一名优秀的程序员,十分优秀!