如何获得Server.MapPath()的短名称格式(8.3 MS-DOS格式)?
我正在使用process.start在ASP.NET服务器上运行控制台应用程序,并且程序的参数需要在旧的MS-DOS 8.3格式中格式化的路径. 例如,可以通过键入" dir/x": 来获得以这种格式的文件夹的控制台名称 如何获得使用文件夹名称的简称版本(8.3 ms-dos格式)格式的server.mappath()? 解决方案 这是托管API ... 不可用的 您需要在Server.MapPath()的结果上使用p/invoke和调用GetShortPathName,只有在Server.MapPath()的结果真正存在时才会成功...请参见 http://pinvoke.net/default/default.aspx/kernel32.getShortPathname and http://msdn.microsoft.com/en-us/library/a36498989%; %29.apx
4 2024-04-23
编程技术问答社区
在WINDOWS表格中嵌入一个DOS控制台
是否可以将DOS控制台嵌入Windows表单或C#2.0中的用户控件? 我们有一个我的Windows应用程序必须与之互动的旧产品,并且有人要求旧产品的实例在Windows应用程序中运行. 目前,我正在使用user32.dll来找到DOS产品正在运行的窗口,最小化然后最大化窗口,然后将字符键入窗口.这不是解决问题的一个很好的解决方案,因为这意味着我的应用程序必须在应用程序设置中存储窗口名称,并且要求用户在使用交互功能之前返回到DOS应用的正确页面. 编辑:更多信息 用户需要可见旧应用程序,但在单独的窗口中不可见. 我已经尝试了Timothyp的答案,并且可以很好地奏效,但是可以实现相同的功能,但是使用DOS窗口在视觉上嵌入Windows式或用户控件中,而不是在其自己的窗口中弹出?最好是以showdialog()方式,使用户无法与应用程序互动,可以说. . 解决方案 可以使用进程类重定向控制台/DOS应用程序的标准输入/输出.它看起来像这样: v
4 2024-04-11
编程技术问答社区
在32位Open Watcom C中生成FAR跳转指令
我需要生成远的跳跃指令才能跳到另一个ISR(中断服务例程).我正在开发32位Freedos应用程序. 阅读OW手册后( cguide.pdff =" http://www.openwatcom.org/ftp/manuals/current/current/clr.pdf" rel =" nofollow"> clr.pdf ),我想出了两种成功编译的方法o任何警告或错误. /* Code Snippet #1 */ #pragma aux old08 aborts ; void (__interrupt __far *old08)(void); // function pointer declaration void __interrupt __far new08(void) { /* Do some processing here ... */ (*old08)(); /*
10 2024-04-10
编程技术问答社区
我如何使用C应用程序访问Freedos的完整内存空间
我有一个用C编写的嵌入式应用程序,在486/386DX风格的处理器上运行(我已经编写了一个简单的程序来调查(在循环中调用malloc()直到返回null指针),尽管每个malloc()请求的大小略微影响结果,但始终约为300kb限制.我的代码必须映射16位内存的块,因为我的malloc()实现似乎仅接受unsigned short参数.我只需要3MB左右,因此并不糟糕,因此大约50个块(这是用于采集数据的圆形缓冲区,因此这种回旋处方法并不那么麻烦).由于我获得了价值超过16位的内存(300k vs 64k),因此我知道这并不是一个完全16位的问题.我猜这与我在研究中阅读的640KB限制有关,但我不明白这是编译器问题还是OS问题. 我正在使用Borland BC5编译器,并且我尝试了各种调整记忆模型和编译器选项,这些调整对结果的影响最小.我目前正在寻找himemx.exe和jemm386.exe,但是到目前为止,我吠叫了很多错误的树木,同时认为这是一个问题.我也开始研究Linux,尽
6 2024-04-10
编程技术问答社区
如何在x86 DOS汇编中读取键盘输入而不 "消耗 "它?
我需要编写一种可以从C代码调用的钥匙库函数. 它的意思是C程序称为"启动仪"的汇编功能,该功能表明要开始按下按键,直到调用称为endlog的函数为止.日志记录应像这样工作:编写按下的任何键的ASCII值,而不会干扰Startlog和Endlog之间的C代码,这意味着,如果C代码也需要读取输入(例如,SCANF,它可以正常工作,则可以正常工作). 我通过将中断向量第9个条目(中断键盘按下)更改为我编写的函数来编写记录器,该函数将值写入文件,并且效果很好.但是,C代码不会获得输入. 基本上我所做的是阅读使用INT 21H按下按键的键,但是在阅读了ASCII值之后,它被"消耗"了,因此我需要一种方法来再次模拟键按键,或者不"消耗"它,因此下一次键读取它读取相同的键. (我用英语描述了代码,因为它很长且笨拙的装配代码) 解决方案 这是您可以做到的: // Compile with Borland's Turbo C++ 1.01 #include #inc
14 2024-04-10
编程技术问答社区
如何在C语言中使用int86函数和REGS结构为8086读取和显示文件数据
我有一个文本文件,其中包含一些内容,我必须将光标从相对转移到BOF,并使用INT 21H/42H. 在屏幕上显示其内容 这是我正在处理的代码.我正在使用VM中的Windows 98(16位DOS),它是我的系统编程分配的一部分,因此我必须使用DOSBOX中的Turbo C ++尝试使用它,但它有一些问题. 在打印上 buff 它显示随机值 代码 #include #include #include #include #include unsigned int handle; char buff[50]; void main(){ union REGS regs; // set pointer union REGS regs_r; // read file handle = open("text.txt", O_RDONLY);
8 2024-04-10
编程技术问答社区
如何在c语言(time.h函数)和DOS中设置(或纠正)时区和DST?
我有一台运行DOS(Freedos 1.1)的计算机和Plain C(用Borland 5.0编译),带有time.h.当我使用BIOS或DATE和TIME DOS命令设置计算机时间时,没有有关时区的信息.我将时间设置为目前的时间上午10:25. 我的C程序做到了... char timeString[80]; time_t timeT = time(NULL); strftime(timeString, sizeof(timeString), "%a %Y-%m-%d %H:%M:%S %Z", localtime(&timeT)); printf("%s\n", timeString); 运行代码时,我会得到正确的当前时间,但是在%Z formatter所调用的末端具有" EST"时区. 星期一2017-03-13 10:25:36 EST 返回的time_t time(NULL)的值是1489418736. 该数学上的分解为47年,83天,15小时25
10 2024-04-09
编程技术问答社区
使用Freedos是否允许我的程序访问超过64 K的内存?
我有兴趣在Freedos的C上编程,同时在此过程中学习一些基本的ASM时,是否会允许我的程序访问超过标准的640K内存? ,其次,关于ASM,我知道在现代处理器上,由于CPU架构的复杂性,很难在组装上编程,但是使用Freedos是否将我限制为可能更简单的16位指令集? 解决方案 没有任何扩展器的程序可以在DOS中使用最大的640kb低内存.但是每个结构将仅限于一个段的大小或64kb.这意味着您可以拥有10个大小64kb的大阵列.当然,您可以在一个段中有多个阵列,但是它们的总尺寸不得超过细分市场的大小.一些编译器还自动处理跨越多个部分的地址,以便您可以无缝使用大于64kb的对象,或者如果您在汇编中写作,也可以执行相同的操作 要访问更多内存,您需要一个扩展器,例如关于组装,您可以在16位模式下使用32位寄存器.有66h和67h的前缀可以更改操作数尺寸.但是,这并不意味着编写16位代码更容易.实际上,它有很多特质值得记住,例如记忆地址中的有限注册使用情况. 32位X86指令
6 2024-04-09
编程技术问答社区
计时器中断C
我必须编写一个关于计时器中断的C文件.程序将在DOSBOX上运行. 程序的功能很简单: 程序调用每个计时器中断的函数(由我输入).这些中断将使用setVect和getVect函数编程. 例如功能,每个中断程序必须调用此功能. 很难找到这种情况的示例,您可以转发任何示例链接吗?感谢您的所有帮助. 解决方案 #include #include #include #include #include #define PERIOD 999999 static sigset_t block ; void timer_handler (); static void init( ) __attribute__((constructor)); void init(){ sigemptyset(&block); sigaddset(&block,SIGVT
16 2024-04-09
编程技术问答社区
在Mac OS上使用GCC为MS-DOS(DOSBox)编译C程序
我正在Mac OS X上的Snow Leopard下运行GCC 4.2.1.我想使用它来编译一些我15年前写的旧的C/C ++ DOS游戏,以便我可以在谢谢! 解决方案 DOSBOX在仿真下运行16位X86房地产代码. OSX 10.6上的常规GCC编译器针对OSX操作系统和32位X86受保护模式,因此您不能使用该模式来构建代码以在DOSBOX中运行. 您可能可以做的就是在DOSBox本身中运行DOS编译器. djgpp 是GCC的MS-DOS端口.我还不清楚DOSBox支持DPMI,但我认为确实如此,并且DJGPP本身在 Borland Turbo C 也在兼容性列表中,并且 tc 2.01 合法免费提供.提供其他版本以供下载其他版本,但我怀疑这种发行版的合法性. 使用 VirtualBox .如果您没有MS-DOS的副本,则可以尝试 freedos . 其他解决方案 可能有些用: 关于debian in debian in debian 的问题 其他解
6 2024-04-08
编程技术问答社区
C语言的串行编程,在DOS中
我需要在旧的16位MS-DOS中在C中进行一些基本的串行编程.我知道基础知识,我已经编码了一些串行通信.在几十年前的某些微控制器中,但这是古老的知识,并且找到信息并不容易. 我正在寻找一些可靠的(不一定是免费或开源的库)或代码,以及一般信息. 假设我在Win7机器上开发了一些有关如何测试的说明/建议.例如,如果可以模拟从我的win7机器中的控制台终端到在DOSBox环境中运行我的DOS程序的模拟com端口或类似的内容的null-modem连接. 解决方案 多么巧合.刚刚完成了使用它的低级硬件上的大学课程. 这些会引导您(自己滚动,没有libs,不难!): 串行端口上的课程滑动 youtherlogic教程 最后一个是葡萄牙语中的,但是评论了代码示例/表格,英文名称可变. 祝你好运. 关于仿真.例如,虚拟PC允许使用文本文件通过虚拟串行端口对数据进行管道.去谷歌上查询.您也可以将Windows 98与DJGPP一起编译.使用old comm
6 2024-04-08
编程技术问答社区
在Borland C++ 3.0上分配一个远端指针需要帮助
我正在编写一个DOS游戏框架,以更好地学习C,并且对旧硬件编程的一般兴趣(尤其是在我长大的系统上). 我正在尝试实现双重缓冲系统,但是我很难将远距离的指针分配给320*200阵列. 起初,我试图使用malloc,但发现它只能在64KB以下分配.我读到您需要使用farmalloc(malloc返回null),并正确分配.但是,当运行_fmemset或_fmemcpy ....整个系统冻结. backBuffer = (unsigned char far*) farmalloc(64000); 是时候交换缓冲区了,我会使用 _fmemcpy(VGA, backBuffer, 64000); 程序正在使用小内存模型. 解决方案 非常有趣的帖子,我也非常喜欢旧硬件. 您是否尝试在中型或大型型号中编译以检查代码是否正确运行? 您确定正确初始化了VGA显示内存的指针吗? 我记得那时,使用内存副本来交换屏幕缓冲区的速度很慢,更不用说您必须等待垂
10 2024-04-08
编程技术问答社区
我如何在 Debian 上编译 DOS 程序?
对于我的汇编语言课,我们正在使用DPMI编写DOS程序.不幸的是,我无法一直访问32位Windows机器.我确实在我使用的每台计算机上都安装了Debian虚拟机. 我已经安装了Dosbox和Dosemu.有什么办法可以在Linux而不是DOS中组装和编译程序?我正在使用NASM,所以我似乎没有任何问题将其汇编DOS格式.但是,我很难通过我的C代码通过编译器运行它并获得DOS可执行文件(使用GCC或MingW). 有什么方法可以做到这一点,还是我几乎必须在DOS下安装所有工具? 解决方案 我什至不确定是否可以使用GCC编译DOS应用程序.很久以前,有一个GCC编译器变化称为DJGPP(或类似的东西).我从来没有工作. 这些天您可以跨编译GCC的机会几乎为零. 我建议您尝试一下旧的Watcom编译器.它是本机DOS编译器,它的DPMI实现也像Dosbox下的魅力一样工作.与NASM编译的对象文件进行接口也不是问题(我做了几年) 今天,编译器已成为开源,称
10 2024-04-08
编程技术问答社区
如何在C语言程序中获得当前文件夹的父目录?
我正在尝试获取我拥有该程序的当前文件夹的父目录. 我需要在我拥有的C程序中包括.我尝试通过字符串方法进行解决并解决它,但是我觉得可以有更好,更简单的方法.例如:如果他的路径为" C:\ Application \ config",那么我想获得 - " C:\ application" Just Parts Path. 有人可以帮我吗? 谢谢 priyanka 解决方案 在原地将字符串截断在其最后的后斜线上: char pathname[MAX_PATH]; GetCurrentDirectory(MAX_PATH, pathname); char* last_backslash = strrchr(pathname, '\\'); if (last_backslash) { *last_backslash = '\0'; } 其他解决方案 有时只是添加\..,如果您不害怕MAX_PATH. 其他解决方案 很难回答您的问题,因为您没有真正指定要
8 2024-04-07
编程技术问答社区
BIOS INT 13H与AH=2每次只能读取72个扇区。为什么?
我正在使用Bochs 2.4.5编写引导扇区代码.我使用INT 13H读取Floppy的扇区.但是我发现,如果该行业数量读取> 72,那么INT13将会失败.返回代码为AH = 1.以下是代码,这里是 int13 .返回代码为AH =1. 为什么INT 13H不能读取超过72个扇区? xorb %ah, %ah xorb %dl, %dl int $0x13 # reset the floppy movw $0x8000, %ax movw %ax,%es movw $0, %bx # ES:BX is the buffer movb $0x02, %ah movb $73, %al # how many sectors to read. 72 is ok, but >=73 is wrong. movb $0, %ch movb $1, %cl movb $0, %dh
6 2024-04-07
编程技术问答社区
什么是DOS中字符表的内存地址?
DOS中字符表的地址是什么,我们可以通过操纵每个字符的像素来创建新字体和符号? 我知道会随着BIOS中断而更改它,但是我只需要DOS中字符表的内存地址即可直接访问. 解决方案 我不记得它是如何完成的(我在二十年前做了这些事情),但是您可能想看看 freevga项目.根据文本模式文档您可以选择地址您自己(Kinda; norda;请参阅字符映射选择寄存器).访问该寄存器的是在这里解释了. 您可能还想看看此介绍这个主题也(并且可能更容易理解). 编辑: 这是一篇文章,说明了如何替换单个字符.他使用 int 10h,ax = 1100H (替代文档)要交换字符,但是在CX寄存器中,您实际上可以告诉您应该交换多少个字符. 这是int 10h函数的非常全面的列表. 编辑2:找到另一个不错的文档 . 编辑3:在最后一个链接的文档中,是: 用于直接访问字符生成器RAM 的编程 以下序列设置了EGA和VGA,以访问字符 - 发电机内存.有关相关信息,请参见
10 2024-04-07
编程技术问答社区
MS | DOS的C语言编译器
我已经在VirtualBox虚拟机上安装了MS-DOS 6.22,一切正常,目的是编译以C语言编写的程序,该程序在(虚拟)RAM中显示和编辑位.但是,我需要一种在虚拟MS-DOS操作系统上安装C编译器的方法. 解决方案 我已经安装了编译器,并且成功工作,如果您想要OVA,则可以在这里进行链接 打开编译器: cd TC TC 就是这样!您可以编写C并编译.最好的部分是您可以在没有任何限制的情况下处理寄存器和内存. 其他解决方案 这是其他人错过的一堆细节: 没人提到 djgpp 这是GCC的受保护模式DOS端口,可能是任何开源选项的最大库和指南选择. (包括 turbo Vision端口用安装howto ) 无论您要做什么, opentwatcom ( source )可能会满足您的需求. OpenWatcom仍然包含使用DOS/4GW的免费许可证,使其在当天如此受欢迎. (当您看到像Doom这样的游戏开始时说" DOS/4GW受保护模式运行时
10 2024-04-07
编程技术问答社区
写入0xb8000000会在屏幕上产生输出,不需要任何打印语句,如`printf`。
#include #include void main() { char far *v = (char far*)0xb8000000; clrscr(); *v = 'w'; v += 2; *v = 'e'; getch(); } 输出是:we 我没有没有任何printf或其他打印语句的输出. 解决方案 这是x86 实体模式 IBM PC程序,它假设在默认存储器位置(b800:0000)映射的彩色文本模式中的CGA/EGA/VGA兼容图形适配器;它基本上是来自MS-DOS(1980年代/1990年代)的时代.无论如何,这是非常古老的学校! char far *v=(char far*)0xb8000000; 视频缓冲区的内存地址(在实际模式下)(如果您有旧的大力神) clrscr(); 清除屏幕 *v='w'; 在行0,列0字符w 上写入 v+=2; 跳过2
8 2024-04-06
编程技术问答社区
在MS-DOS中检查一个键是否处于关闭状态(C/C++)。
是的,我的意思是真正的MS-DOS,而不是Windows'cmd.exe shell Console. 是否有一种方法可以检查键是否在MS-DOS中下降,类似于Winapi中的GetAsyncKeyState()函数? 目前我正在使用kbhit()和getch(),但它确实很慢,在第一个字符之后有延迟,不允许同时允许多个键等. 我正在使用涡轮C ++ 3.1.谁能帮忙? (顺便说一句,不要问为什么我在如此古老的系统上编码我的游戏) 解决方案 您为什么要在Su上编码游戏……只是开玩笑! 在MS-DOS中," API"函数被用作中断服务器.在x86汇编语言中,您使用 INT指令打断要执行的要执行.大多数中断要求在执行INT之前将其"参数"设置在某些寄存器中.在INT指令将控件返回您的代码之后,其结果将被放置在某些寄存器和/或标志中,如中断呼叫的文档所定义. . 我不知道Turbo C ++如何实现中断,因为这可以预先参与编程,但我确实知道它可以使
8 2024-04-06
编程技术问答社区
在C语言中,我如何在DOS(真正的DOS,MS DOS 6.22)中写到一个特定的内存位置,例如视频内存b800。
在C中,如何写入特定的内存位置,例如视频内存B800,在DOS中(Real DOS,MS DOS 6.22) 我知道C中没有任何内置的事情可以做到这一点,但是可能有一些特定于平台的平台. DOS特定的API函数可以. 这样做的小型演示程序. 我有涡轮c(tcc.exe-不是微小的C编译器,涡轮C编译器) 我知道Debug可以做到(例如,我知道的一些小调试)-f b800:0 FA0 21 CE(这在命令行中写了一些感叹号).但是我想写一个C程序来写给B800:0 解决方案 地址b800:0000使用0xb800的段和0x0000的偏移.这对应于线性地址0xb8000(请注意额外的0,因为该段左移4位). 在中创建指向此地址的指针> char *p = (char *)0xb8000; 但是,您最有可能在真实模式上href =" https://en.wikipedia.org/wiki/far_pointer" rel =" noreferre
6 2024-04-06
编程技术问答社区