用shell让指定程序打开text1.text为地址的文件

用shell让指定程序打开text1.text为地址的文件,第1张

比如用笔记本程序打开个文件,注意:text1text为文件完整路径和文件名

Shell("c:\windows\notepadexe "+ text1text, vbNormalFocus)

关键注意调用指定程序路径和参数,比如打开网络连接。

Shell "rasphone -d 宽带连接", vbNormalFocus

由于调用外部程序会出现多种错误,建议使用winapi的ShellExecute。

HMODULE hModule = GetModuleHandle(_T("bdll")); // 获取bdll句柄

MODULEINFO mi;

GetModuleInformation(NULL, hModule, &mi, sizeof(MODULEINFO)); // 获取bdll信息

// milpBaseOfDll就是bdll的加载起始地址

强大的MDK几乎可以满足我们所需要的所有功能。一般在链接时各程序的地址是由链接器自动分配的。但在有些时候,比如做测试时,需要将某个指定的子程序入口地址固定在一个指定的地址。其实通过一些简单的配置就可达到这一目的。下面以C51版MDK为例说明其配置过程。

比如某例程中有UART_VINIT、IO_VINIT、MAIN_VINIT、MAIN、TIMER2等函数。其中TIMER2是我们需要固定其入口地址的函数。编译链接之后在工程目录下会生成M51文件(后缀为M51)。可以用记事本将其打开。打开后我们找到LINK MAP OF MODULE 项,在默认编译链接情况下其内容为:

LINK MAP OF MODULE: T2test2 (TIMER)

TYPE BASE LENGTH RELOCATION SEGMENT NAME

-----------------------------------------------------

D A T A M E M O R Y

REG 0000H 0008H ABSOLUTE "REG BANK 0"

DATA 0008H 0001H UNIT DTMAINTIMER

DATA 0009H 0001H UNIT DTGETCHAR

000AH 0016H GAP

BIT 0020H0 0000H1 UNIT BIGETCHAR

0020H1 0000H7 GAP

IDATA 0021H 0001H UNIT STACK

C O D E M E M O R Y

CODE 0000H 0003H ABSOLUTE

0003H 0028H GAP

CODE 002BH 0003H ABSOLUTE

002EH 07D2H GAP

CODE 0800H 0062H UNIT PRMAINTIMER

CODE 0862H 0027H UNIT PRPUTCHARPUTCHAR

CODE 0889H 0026H UNIT CLIB_CODE

CODE 08AFH 001FH UNIT PRUART_VINITSTARTUP

CODE 08CEH 001EH UNIT PRMAIN_VINITSTARTUP

CODE 08ECH 0011H UNIT PRGETCHARGETCHAR

CODE 08FDH 000CH UNIT C_C51STARTUP

CODE 0909H 000BH UNIT PRTIMER2TIMER

CODE 0914H 000AH UNIT PR_GETKEY_GETKEY

CODE 091EH 0004H UNIT PRIO_VINITSTARTUP

以上就是链接后各函数的入口地址信息。找到我们需要指定入口地址的项。这里假设我们需要指定TIMER2这个子函数。找到其对应项“PRTIMER2TIMER”,其中间部分即为函数名,后部分为所在文件名。我们发现其入口地址为0909H,长度为000BH。找到这一项之后,复制其值。然后打开菜单Project,选择Options,再选择BL51 Locate项。在Code栏后面的输入框里粘下所复制的值,然后在后面加上小括号,括号内给出其入口地址的值。如 PRTIMER2TIMER(0x1000)。如图一所示:

图一

点击确定后,重新编译链接,再打开M51文件,发现LINK MAP OF MODULE项内容变为:

LINK MAP OF MODULE: T2test2 (TIMER)

TYPE BASE LENGTH RELOCATION SEGMENT NAME

-----------------------------------------------------

D A T A M E M O R Y

REG 0000H 0008H ABSOLUTE "REG BANK 0"

DATA 0008H 0001H UNIT DTMAINTIMER

DATA 0009H 0001H UNIT DTGETCHAR

000AH 0016H GAP

BIT 0020H0 0000H1 UNIT BIGETCHAR

0020H1 0000H7 GAP

IDATA 0021H 0001H UNIT STACK

C O D E M E M O R Y

CODE 0000H 0003H ABSOLUTE

0003H 0028H GAP

CODE 002BH 0003H ABSOLUTE

002EH 07D2H GAP

CODE 0800H 0062H UNIT PRMAINTIMER

CODE 0862H 0027H UNIT PRPUTCHARPUTCHAR

CODE 0889H 0026H UNIT CLIB_CODE

CODE 08AFH 001FH UNIT PRUART_VINITSTARTUP

CODE 08CEH 001EH UNIT PRMAIN_VINITSTARTUP

CODE 08ECH 0011H UNIT PRGETCHARGETCHAR

CODE 08FDH 000CH UNIT C_C51STARTUP

CODE 0909H 000AH UNIT PR_GETKEY_GETKEY

CODE 0913H 0004H UNIT PRIO_VINITSTARTUP

0917H 06E9H GAP

CODE 1000H 000BH UNIT PRTIMER2TIMER

在链接信息中发现TIMER2函数已经定位到地址1000H。当然在下载到目标板或者在模拟器中调试时,可以发现在地址1000H处是函数TIMER2的入口地址。至此,子函数定位完成。

以上就是关于用shell让指定程序打开text1.text为地址的文件全部的内容,包括:用shell让指定程序打开text1.text为地址的文件、怎么获取自身程序指定DLL模块的入口地址、MDK ARM如何设置子程序入口地址等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9859707.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存