王者荣耀梦奇图片怎么玩 梦奇技能分析

void __stdcall View(uint8_t Para, int32_t *a, int32_t *b,
int32_t *c, uint32_t *d, uint32_t *e);很简单的一个DLL,在VB里面怎么声明呢,然后还要获取里面的值,请教大家了[解决办法]VB6里有几个函数是用来取地址的,就是你所说的指针。比如:VarPtr温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(1316)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'C#调用C++ dll(非空指针传参、函数传参;数组、二位数组结构体参数)',
blogAbstract:'&&& C++结构体struct{&char
sFileName[100];
NET_DVR_TIME
struStartTime;',
blogTag:'c#,c++,dll',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:4,
publishTime:8,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}C语言,主程序怎么把文件指针传给dll
如题,最好给个例子
为什么是文件指针而不是文件名?
如果非是文件指针,主程序open得到FILE*指针,做为参数传给dll里的函数,不行嘛?
引用来自“周翼翼”的答案为什么是文件指针而不是文件名?
如果非是文件指针,主程序open得到FILE*指针,做为参数传给dll里的函数,不行嘛?不行的
诶,dll不就是个函数库么;用户层程序用的是句柄(数组索引),系统层程序(如驱动)可以用指针(数组的具体值)【ms规定的】;win内核是基于面向对象的思想的,当我们使用资源是会产生一个上下文(就像指令的上下文:ip,cs,ss,eax...),如当操做文件时,是不需要记录当前记录的位置了,这个信息就记录在对象(在打开文件时创建)里面;对象属于对象目录;对象说明白点就是个数据结构,对象指针指向它;应用程序有个数组记录你打开的资源(句柄,指针);当然是否有H能绕过这个机制,在应用层用指针这我就不知道了;
1. 新建一个dll项目,名字为file-dll,在file-dll.cpp里面添加以下代码,然后编译:
#include &stdio.h&
extern &C&
__declspec(dllexport)
long MyFileHandler(void **aFile);
long MyFileHandler(void **aFile)
if (!aFile)
return -1;
FILE *file = (FILE*)(*aFile);
if (!file)
return -1;
fseek(file, 0, SEEK_END);
return ftell(file);
2. 新建一个exe项目,名字为file-exe(console类型的),在file-exe.cpp里面添加以下代码, 运行之前把file-dll.dll复制到file-exe项目的Debug目录。
#include &windows.h&
typedef long (* MyFileHandler_Ptr)(void **aFile);
int _tmain(int argc, _TCHAR* argv[])
HMODULE dll = LoadLibraryA(&file-dll.dll&);
return -1;
MyFileHandler_Ptr myFileHandler = (MyFileHandler_Ptr)GetProcAddress(dll, &MyFileHandler&);
if (!myFileHandler)
return -1;
FILE *file = fopen(&k:\\temp\\sites.txt&, &rb&);
long testValue = 0;
testValue = myFileHandler((void**)&file);
printf(&testValue = %d\n&, testValue);
fclose(file);
printf(&test failed.\n&);
getchar();
引用来自“hikari”的答案1. 新建一个dll项目,名字为file-dll,在file-dll.cpp里面添加以下代码,然后编译:
#include &stdio.h&
extern &C&
__declspec(dllexport)
long MyFileHandler(void **aFile);
long MyFileHandler(void **aFile)
if (!aFile)
return -1;
FILE *file = (FILE*)(*aFile);
if (!file)
return -1;
fseek(file, 0, SEEK_END);
return ftell(file);
2. 新建一个exe项目,名字为file-exe(console类型的),在file-exe.cpp里面添加以下代码, 运行之前把file-dll.dll复制到file-exe项目的Debug目录。
#include &windows.h&
typedef long (* MyFileHandler_Ptr)(void **aFile);
int _tmain(int argc, _TCHAR* argv[])
HMODULE dll = LoadLibraryA(&file-dll.dll&);
return -1;
MyFileHandler_Ptr myFileHandler = (MyFileHandler_Ptr)GetProcAddress(dll, &MyFileHandler&);
if (!myFileHandler)
return -1;
FILE *file = fopen(&k:\\temp\\sites.txt&, &rb&);
long testValue = 0;
testValue = myFileHandler((void**)&file);
printf(&testValue = %d\n&, testValue);
fclose(file);
printf(&test failed.\n&);
getchar();
确定能行?
别这么干,会出问题的!
--- 共有 1 条评论 ---
请教一下,具体会出什么问题?
~~,我明白了.不能这么传.main函数和dll函数并不是在同一进程空间内的,dll里有个dllmain不是?不同进程空间的内存不能传来传去,我试过,好像是在main里申请的char[]也不能传进dll,内存保护?
--- 共有 2 条评论 ---
: 你说的对.我再学习学习.
这里的代码没有创建一个新的进程
引用来自“大竹叶青”的答案
引用来自“hikari”的答案
1. 新建一个dll项目,名字为file-dll,在file-dll.cpp里面添加以下代码,然后编译:
#include &stdio.h&
extern &C&
__declspec(dllexport)
long MyFileHandler(void **aFile);
long MyFileHandler(void **aFile)
if (!aFile)
return -1;
FILE *file = (FILE*)(*aFile);
if (!file)
return -1;
fseek(file, 0, SEEK_END);
return ftell(file);
2. 新建一个exe项目,名字为file-exe(console类型的),在file-exe.cpp里面添加以下代码, 运行之前把file-dll.dll复制到file-exe项目的Debug目录。
#include &windows.h&
typedef long (* MyFileHandler_Ptr)(void **aFile);
int _tmain(int argc, _TCHAR* argv[])
HMODULE dll = LoadLibraryA(&file-dll.dll&);
return -1;
MyFileHandler_Ptr myFileHandler = (MyFileHandler_Ptr)GetProcAddress(dll, &MyFileHandler&);
if (!myFileHandler)
return -1;
FILE *file = fopen(&k:\\temp\\sites.txt&, &rb&);
long testValue = 0;
testValue = myFileHandler((void**)&file);
printf(&testValue = %d\n&, testValue);
fclose(file);
printf(&test failed.\n&);
getchar();
确定能行?
VS2008我运行过了,这段代码是可行的,但是补充说明一下的是,这里代码不是说最好的或者最合理的甚至说最安全的,只是用来说明你提出的问题的其中一个可尝试的方案。用_open函数也可以,那个返回到是int,用CreateFileW/CreateFileA的WINAPI返回的是HANDLE,但是这个HANDLE要是要传到别的进程里面,需要在CreateProcess的启动参数设置句柄可继承,或者用DuplicateHandle复制一个HANDLE给新的进程,不过这样有点复杂化了。
Dll要导出FILE*是不可以的,因为导出Dll函数时也需要把参数涉及的结构也导出,这样有可能要导出很大一棵关联的定义树。
所以用了void**,在32位的情况下,传递结构指针的地址是一个较简单的做法。
这里不涉及多进程,也不需定义fastcall或者stdcall之类的,但是要保证exe和dll的默认调用协议都是一样的。
如果你试过不行,请多多指教,个人用vc也不是很久。
如果你对vc研究感兴趣,也欢迎参观我的浏览器项目(涉及到vc/c#,浏览器接口,浏览器控件,detours沙盒原理,内存加载dll原理。),里面有一些调用dll的示范项目。
引用来自“周翼翼”的答案~~,我明白了.不能这么传.main函数和dll函数并不是在同一进程空间内的,dll里有个dllmain不是?不同进程空间的内存不能传来传去,我试过,好像是在main里申请的char[]也不能传进dll,内存保护?传是可以传的,应用程序切入内核是通过调用WIN32API(crt也会调用),而win32api是以dll形式提供的(user32.dll,kernel32.dll,gdi32.dll),举个例子:在读文件的时候是否回传个地址给read();dll和调用它的进程是在同一个进程空间里的(属于关系),只是在物理内存中只有一份dll,进程调用它,就映射进自己的虚拟地址空间(系统dll映射地址都一样【所有进程用的是同一个系统】,用户态dll就有可能不一样,如果建议地址没被占用就一样,如:有的映射到0X,有点到0X随便举的);能不能吧地址传入dll,要看具体的声明;在调用dll时,有一个多线程的问题(即函数是否可重入的问题),要用同步对象进行同步或异步;有一个多进程的问题,多个进程同时映射时的地址,这个是dll有自己的存储空间,就像线程的TLS;还有是dll是系统态的还用户态,如果是系统态的在吧地址传进去后,发生了调度,这个虚拟地址在别的进程指向了别的空间,一般就要可以把虚拟地址换为物理地址再用;不同进程空间的地址也可以传,只是不是直接传的,比如,不同进程间的同步,共享内存啊;实际能不能传就是虚拟地址与物理地址映射的问题,会不会因执行顺序而结果不一样; &
一家之言,仅供参考
--- 共有 1 条评论 ---
我再去学习看看能不能理解.
引用来自“周翼翼”的答案~~,我明白了.不能这么传.main函数和dll函数并不是在同一进程空间内的,dll里有个dllmain不是?不同进程空间的内存不能传来传去,我试过,好像是在main里申请的char[]也不能传进dll,内存保护?怎么会不同的进程空间???? 应该是相同的。
--- 共有 1 条评论 ---
是相同的.我理解错了.比特客户端
您的位置:
详解大数据
详解大数据
详解大数据
详解大数据
Java调用Dll存在指针或变参的解决方法
关键字:Java
 企业软件热点文章
  假设我有一个叫test.dll的动态库,其中有一个函数如下:
  extern "C" int add(int* a,int* b,int* c,int d,char* PicPath)
  FILE *
  fp=fopen(PicPath,"wt");
  for(int i=0;i<D;I++)
  c[i]=a[i]+b[i];
  fprintf(fp,"%d\n",c[i]);
  fclose(fp);
  return 1;
  该函数的功能是a,b两个数组的值相加,和存放的数组c中,在将和写入到指定的文件,数组的维数
  有传入的参数决定。
  问题提出:
  1.Java中如何调用指针类型的参数;
  2.整形的参数可以直接传入吗?;
  3.PicPath为何是指针型的,怎么不是CString类型的;
  4.如何获取输入型参数的返回值;
  Java调用动态链接库的代码如下:
  JNative t= new JNative("test.dll", "add"); //加载test.dll文件,并调用add方法;
  t.setRetVal(Type.INT); // 设置调用后的返回类型
  // Java中构造指针,并为指针分配空间
  Pointer a = new Pointer(MemoryBlockFactory.createMemoryBlock(4 * 10));
  Pointer b = new Pointer(MemoryBlockFactory.createMemoryBlock(4 * 10));
  Pointer c = new Pointer(MemoryBlockFactory.createMemoryBlock(4 * 10));
  Pointer strP= createPointer(100);
  strP.setStringAt(0, "C:\\1.txt");
  int d=10;
  // 为数组a和b赋值
  for (int i = 0; i <D; p i++) {
  a.setIntAt(4 * i, i);
  b.setIntAt(4 * i, i);
  // 设置参数:
  t.setParameter(0, a);
  t.setParameter(1, b);
  t.setParameter(2, c);
  t.setParameter(3, d);
  t.setParameter(4, strP);
  t.invoke(); // 调用函数并执行
  // 输出和的值,注意:一个整形值需要用4个字节,所以j前面需要乘以4
  for (int j = 0; j <D; p {
  System.out.println(c.getAsInt(4 * j));
  // 释放内存
  a.dispose();
  b.dispose();
  c.dispose();
  好了,这样一个完整的调用例子就结束了,我只是写出了程序中的关键的代码,具体的还需要写一
  个类,并且继承一个基类,在复写基类中的方法,这些都比较简单,大家可以参考一下网上的其他
  例子。
  问题解答:
  1.Java中调用指针类型的参数:需要创建Pointer变量,并为其分配空间
  2.整形的数据可以直接传入;
  3.JNative对CString类型支持不是很良好,调用CString的方法时,经常会报一些异常,所以我把路径改成
  的字符指针;
  4.输入型参数作为输出:可以参见以上的例子,数组c是如何设置和输出的。
[ 责任编辑:之极 ]
去年,手机江湖里的竞争格局还是…
甲骨文的云战略已经完成第一阶段…
软件信息化周刊
比特软件信息化周刊提供以数据库、操作系统和管理软件为重点的全面软件信息化产业热点、应用方案推荐、实用技巧分享等。以最新的软件资讯,最新的软件技巧,最新的软件与服务业内动态来为IT用户找到软捷径。
商务办公周刊
比特商务周刊是一个及行业资讯、深度分析、企业导购等为一体的综合性周刊。其中,与中国计量科学研究院合力打造的比特实验室可以为商业用户提供最权威的采购指南。是企业用户不可缺少的智选周刊!
比特网络周刊向企业网管员以及网络技术和产品使用者提供关于网络产业动态、技术热点、组网、建网、网络管理、网络运维等最新技术和实用技巧,帮助网管答疑解惑,成为网管好帮手。
服务器周刊
比特服务器周刊作为比特网的重点频道之一,主要关注x86服务器,RISC架构服务器以及高性能计算机行业的产品及发展动态。通过最独到的编辑观点和业界动态分析,让您第一时间了解服务器行业的趋势。
比特存储周刊长期以来,为读者提供企业存储领域高质量的原创内容,及时、全面的资讯、技术、方案以及案例文章,力求成为业界领先的存储媒体。比特存储周刊始终致力于用户的企业信息化建设、存储业务、数据保护与容灾构建以及数据管理部署等方面服务。
比特安全周刊通过专业的信息安全内容建设,为企业级用户打造最具商业价值的信息沟通平台,并为安全厂商提供多层面、多维度的媒体宣传手段。与其他同类网站信息安全内容相比,比特安全周刊运作模式更加独立,对信息安全界的动态新闻更新更快。
新闻中心热点推荐
新闻中心以独特视角精选一周内最具影响力的行业重大事件或圈内精彩故事,为企业级用户打造重点突出,可读性强,商业价值高的信息共享平台;同时为互联网、IT业界及通信厂商提供一条精准快捷,渗透力强,覆盖面广的媒体传播途径。
云计算周刊
比特云计算周刊关注云计算产业热点技术应用与趋势发展,全方位报道云计算领域最新动态。为用户与企业架设起沟通交流平台。包括IaaS、PaaS、SaaS各种不同的服务类型以及相关的安全与管理内容介绍。
CIO俱乐部周刊
比特CIO俱乐部周刊以大量高端CIO沙龙或专题研讨会以及对明星CIO的深入采访为依托,汇聚中国500强CIO的集体智慧。旨为中国杰出的CIO提供一个良好的互融互通 、促进交流的平台,并持续提供丰富的资讯和服务,探讨信息化建设,推动中国信息化发展引领CIO未来职业发展。
IT专家新闻邮件长期以来,以定向、分众、整合的商业模式,为企业IT专业人士以及IT系统采购决策者提供高质量的原创内容,包括IT新闻、评论、专家答疑、技巧和白皮书。此外,IT专家网还为读者提供包括咨询、社区、论坛、线下会议、读者沙龙等多种服务。
X周刊是一份IT人的技术娱乐周刊,给用户实时传递I最新T资讯、IT段子、技术技巧、畅销书籍,同时用户还能参与我们推荐的互动游戏,给广大的IT技术人士忙碌工作之余带来轻松休闲一刻。
微信扫一扫
关注Chinabyte

我要回帖

更多关于 王者荣耀梦奇技能顺序 的文章

 

随机推荐