logo资料库

c++调用ansys.doc

第1页 / 共12页
第2页 / 共12页
第3页 / 共12页
第4页 / 共12页
第5页 / 共12页
第6页 / 共12页
第7页 / 共12页
第8页 / 共12页
资料共12页,剩余部分请下载后查看
中压封闭母线及低压母线槽系统的仿真软件分析与研究
如何调试 Windows 外壳扩展程序(Shell Extension) (hangwire 发表于 2002-8-11 19:33:08) 要想用Visual C++调试Windows外壳扩展程序,你必须在工程中指定Windows外壳作为调试环境,即 “Executable For Debug Session”,然后用VC++ 6.0中的调试器重新启动调试过程。具体步骤如下: 1、在Visual C++开发环境中启动外壳扩展,进入工程的“Project|Settings”菜单,然后选择“Debug”标 签,在“Executable For Debug Session”编辑框中输入外壳执行程序,也就是资源管理器路径,<资源管理 器程序路径>\ Explorer.exe. 2、进入任务栏的“开始”菜单,单击“关机”。此时弹出关机对话框,然后按下CTRL+ALT+SHIFT组合 键的同时按下关机对话框的“取消”按钮,此时外壳程序被终止。也就是说你的桌面上和任务栏中的所 有图标全部消失。 不要怕啦,这只是关掉了Windows的外壳,其它的一切依然故我,地球该怎么转还在怎么转。已经 启动的程序仍然在运行……. 3、启动Visual C++的调试器便可以调试外壳扩展了。 在调试器下运行资源管理器与正常情况下运行的资源管理器是不一样的,很容器引起混乱,这是因 为“任务栏”和“开始”菜单按钮是资源管理器的一部分。要想调试某个文件的上下文菜单,当资源管理器 在调试器下运行时,它仍然需要从“开始”菜单启动一个资源管理器实例。 在Windows 9x系统里调试的注意事项:结束调试后,在桌面的任何地方双击鼠标便重启外壳。此时 弹出任务管理对话框,在“文件”菜单上单击“运行”,然后输入资源管理器程序(Explorer.exe)的路 径,按“确定”按钮后一切恢复正常。 在Windows NT系统里调试的注意事项:结束调试后,按下CTRL+ALT+DEL组合键,选择“任务管理 器”按钮,弹出任务管理器对话框,在“文件”菜单选中“新任务/运行…..”菜单项,然后输入资源管理器 程序(Explorer.exe)的路径即可恢复。 打开一个文件: 用WinExec函数可打开外部程序,以打开记事本为 例: WinExec(_T("c:\\windows\\notepad.exe"),SW_SHOWMAXIMIZED); //注意,路径中反斜杠用法。 MFC将任意文件放入资源中调用 将一个版本的程序包含到另一个版本(母体)里面,母体在运行的时候,判断是不是自 己需要的版本,如果是,那么就运行,如果不是,那么释放出包含的那个版本的程序, 然后运行释放出来的程序。 这样就没有必要将两个程序捆绑到一起,只是把一个程序当 作那个母体程序的资源包含到母体程序里面 新建了一个mfc工程,然后在查看资源的地方,选择添加资源,会出现一个对话框, 一 个打开文件对话框,这里选择打开一个exe文件,然后又会出现一个对话框,让输入资 源的 类型,这里输入exe,因为添加的文件是exe文件,当然添加的是什么文件就要输入 相应的类 型(扩展名),然后资源就会被添加进去,并且vc会自动在左边打开(二进制 的),左边的资源默认为IDR_EXE1,然后编写代码
hrFile HRSRC FindResource(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_EXE1), "EXE "); 这连个参数很重要 = //后面 if(hrFile==NULL) { AfxMessageBox( "没有找到资源 "); } HGLOBAL hgFile = LoadResource(AfxGetInstanceHandle(),hrFile); if(hgFile==NULL) { AfxMessageBox( "加载资源失败 "); } LPVOID pvFile = LockResource(hgFile); if(pvFile==NULL) { AfxMessageox( "不能加载内存 "); } HANDLE ",GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0); CreateFile( "C:\\amn.exe hfFile = DWORD nFileLength = SizeofResource(AfxGetInstanceHandle(),hrFile); DWORD nWriteLength; WriteFile(hfFile,pvFile,nFileLength,&nWriteLength,NULL); CloseHandle(hfFile); FreeResource(hrFile); 这样就会在c:\下面生成一个amn.exe,这个就是当时包含进去的那个exe文件。 void CAaDlg::OnButton1() { // TODO: Add your control notification handler code here
STARTUPINFO StartupInfo = { 0 }; PROCESS_INFORMATION ProcessInfo = { 0 }; TCHAR szCmdLine[MAX_PATH] = _T("notepad.exe C:\\Documents and Settings\\Administrator\\桌面 \\ANSYS基于VC++6.0的二次开发与相互作用分析在ANSYS中的实现.txt"); StartupInfo.cb=sizeof(STARTUPINFO); // 初始化 StartupInfo.dwFlags=STARTF_USESHOWWINDOW; StartupInfo.wShowWindow=SW_SHOWMAXIMIZED; //调用方法一 //第二个参数必须是非常量字符串,否则可能会产生编译错误 if(!::CreateProcess(NULL,szCmdLine, NULL,NULL,FALSE,0,NULL,NULL,&StartupInfo,&ProcessInfo)) { AfxMessageBox("error!"); GetLastError(); } //调用方法二 HRESULT hr = E_FAIL; hr = StringCchCopy(szCmdLine, MAX_PATH, _T("C:\\Documents and Settings\\Administrator\\桌面 \\ANSYS基于VC++6.0的二次开发与相互作用分析在ANSYS中的实现.txt"); _ASSERT(S_OK == hr); //第二个参数必须是非常量字符串,否则可能会产生编译错误 if(!::CreateProcess(_T("C:\\windows\\notepad.exe"),szCmdLine, NULL,NULL,FALSE,0,NULL,NULL,&StartupInfo,&ProcessInfo)) { AfxMessageBox("error!"); GetLastError(); } } //调用方法二 //HRESULT hr = E_FAIL; //hr = StringCchCopy(szCmdLine, MAX_PATH, _T(" C:\\Documents and Settings\\Administrator\\桌 面\\ANSYS基于VC++6.0的二次开发与相互作用分析在ANSYS中的实现.txt"); //使用第二种调用方法,命 令行串前面必须要有一空格,刚才漏写了 ANSYS 基于 VC++6.0 的二次开发与 相互作用分析在 ANSYS 中的实现 1 概述 ANSYS 是一套功能十分强大的有限元分析软件,能实现多场及多场耦合分 析;是实现前后处理、求解及多场分析统一数据库的一体化大型 FEA 软件; 支持异种、异构平台的网络浮动,在异种、异构平台上用户界面统一、数据 文件全部兼容,强大的并行计算功能支持分布式并行及共享内存式并行。该 软件具有如下特点: (1) 完备的前处理功能 ANSYS 不仅提供了强大的实体建模及网格划分工具,可以方便地构造数学 模型,而且还专门设有用户所熟悉的一些大型通用有限元软件的数据接口 (如 MSC/NSSTRAN,ALGOR,ABAQUS 等),并允许从这些程序中读 取有限元模型数据,甚至材料特性和边界条件,完成 ANSYS 中的初步建模
工作。此外,ANSYS 还具有近 200 种单元类型,这些丰富的单元特性能使 用户方便而准确地构建出反映实际结构的仿真计算模型。 (2) 强大的求解器 ANSYS 提供了对各种物理场量的分析,是目前唯一能融结构、热、电磁、 流体、声学等为一体的有限元软件。除了常规的线性、非线性结构静力、动 力分析外,还可以解决高度非线性结构的动力分析、结构非线性及非线性屈 曲分析。提供的多种求解器分别适用于不同的问题及不同的硬件配置。 (3) 方便的后处理器 ANSYS 的后处理分为通用后处理模块(POST1)和时间历程后处理模块 (POST26)两部分。后处理结果可能包括位移、温度、应力、应变、速度 以及热流等,输出形式可以有图形显示和数据列表两种。 (4) 多种实用的二次开发工具 ANSYS 除了具有较为完善的分析功能外,同时还为用户进行二次开发提供 了多种实用工具。如宏(Marco)、参数设计语言(APDL)、用户界面设计 语言(UIDL)及用户编程特性(UPFs),其中 APDL(ANSYS Parametric Design Language)是一种非常类似于 Fortran77 的参数化设计解释性语 言,其核心内容为宏、参数、循环命令和条件语句,可以通过建立参数化模 型来自动完成一些通用性强的任务;UIDL(User Interface Design Language)是 ANSYS 为用户提供专门进行程序界面设计的语言,允许用户 改变 ANSYS 的图形用户界面(GUI)中的一些组项,提供了一种允许用户灵活 使用、按个人喜好来组织设计 ANSYS 图形用户界面的强有力工具; UPFs(User Programmable Features)提供了一套 Fortran77 函数和例程以扩 展或修改程序的功能,该项技术充分显示了 ANSYS 的开放体系,用户不仅 可以采用它将 ANSYS 程序剪裁成符合自己所需的任何组织形式(如可以定 义一种新的材料,一个新的单元或者给出一种新的屈服准则),而且还可以 编写自己的优化算法,通过将整个 ANSYS 作为一个子程序调用的方式实 现。 鉴于上述特点,近几年来,ANSYS 软件在国内外工程建设和科学研究中得 到了广泛的应用。但这些应用大多局限于直接运用 ANSYS 软件进行实际工 程分析,对利用 ANSYS 提供的二次开发工具进行有限元软件设计却很少涉 及。本文首次利用 ANSYS 软件的二次开发功能,以 VC++6.0 为工具,运用 APDL 语言,对 ANSYS 进行二次开发,编制框筒结构-桩筏基础-土相互 作用体系与地震反应分析程序。 2 程序设计目标 针对某一实际工程问题,ANSYS 所提供的 APDL 语言可对 ANSYS 软件进行 封装。APDL 语言即 ANSYS 软件提供的参数化设计语言,它的全称是 ANSYS Parametric Design Language。 使用 APDL 语言可以更加有效地进 行分析计算,可以轻松地进行自动化工作(循环、分支、宏等结构),而 且,它是一种高效的参数化建模手段。使用 APDL 语言进行封装的系统可以 只要求操作人员输入前处理参数,然后自动运行 ANSYS 进行求解。但完全 用 APDL 编写的宏还存在弱点。比如用 APDL 语言较难控制程序的进程,虽 然它提供了循环语句和条件判断语句,但总的来说还是难以用来编写结构清 晰的程序。它虽然提供了参数的界面输入,但功能还不是太强,交互性不够
流畅。针对这种情况,本文用 VC++6.0 开发框筒结构-桩筏基础-土相互作 用有限元分析程序(简称 LWS 程序)。 本程序设计目标是利用 VC++6.0 对 ANSYS 进行封装。用 VC++6.0 对 ANSYS 模拟框筒结构-桩筏基础-土相互作用进行二次开发,用户只需输 入诸如地震波、计算时间步长、阻尼比等物理性能参数等,系统就能自动调 用 ANSYS 计算程序,自动进行网格划分、地震动加载以及自动求解。该系 统由于前台开发友好、方便、易用的人机交互界面,对复杂的、难于理解和 掌握的 ANSYS 命令流进行后台封装,因此,程序设计可让即使从未认真学 习过 ANSYS 软件的工程设计人员也能很好地借助本系统进行结构抗震性能 有限元分析,具有较强的处理实际问题能力。 用户输入计算参数,即可调用后台的 ANSYS 命令进行计算,ANSYS 把计算 结果返回给用户,进行后处理。 程序设计的主要原则和功能如下: (1)方便原则,即程序模块应具有良好的用户界面和易用性。程序前台设计采 用 Windows 提供的标准图形用户界面(GUI),用户无须接受专门训练即可使 用。同时,程序应具有良好的容错和纠错能力,避免用户操作不当造成损 失。 (2)程序系统能够提供用户以下功能: ①允许用户可以根据实际计算工况,输入特定的计算参数,包括地震波选 择、计算时间步长、地震波调幅与否等。 ②用户在输入各种参数以后、进行计算之前可以对输入的数据进行修改、添 加和删除操作,以保证输入正确的参数。 ③用户通过界面调用后台的 ANSYS 命令流进行计算,能够得到最后的计算 结果文件,供用户进行后处理和结果分析。 ④用户可以添加新的功能或新的二次开发以实现程序升级。 (3)程序应具有良好的可移植性,不依赖于特定的硬件设备,只要能安装 ANSYS 和 VC++6.0 的硬件环境都能使用本系统,保证程序使用的广泛 性。 (4)程序代码应具有开放性和可重用性。这样,在进一步的设计中,能保证设 计者可以方便地对代码进行修改扩充;同时,提供一定的设计接口,新的设 计者可以根据接口,无须对程序进行大幅度的修改,就可以进行新的开发, 以适应新的特殊要求。 程序的开发平台是 Microsoft VC++6.0、ANSYS6.1,基于 WindowsXP 编 程。程序实现是利用微软提供的 Windows 编程接口 MFC 和 ANSYS 公司的 ANSYS/Multiphysics 产品,采用面向对象的程序设计方法。 3 程序的主要模块和设计 如图 3-2 所示,程序的主要模块有:用户界面模块、ANSYS 计算模块、VC 调用接口模块和 VC 后处理模块,分别论述如下: 3.1 ANSYS 模块 ANSYS 为了满足用户的特殊需求,建立了开放的体系结构,提供了二次开 发接口 APDL、UIDL 和 UPFs(User Programming Features,用户编程特 性)等。其中,ANSYS 接口允许用户将自己的 VC 代码连到 ANSYS 中去, 或将 ANSYS 作为子程序调用,从而使 ANSYS 具备特殊的功能。
本文的 ANSYS 模块是使用 APDL 语言进行二次开发的。在上面的二次开发 中用到了参数化设计方法。参数是 APDL 的变量(它们更象 FORTRAN 变 量,而不像 FORTRAN 参数),不必明确声明参数类型,所有数值变量都以 双精度数存储。被使用但未声明的参数都被赋予接近 0 的“极小值”。在二次 开发中使用参数化设计方法,增强了程序的易读性和可移植性。用户无须了 解程序的具体结构只需改变参数值就可自动调用 ANSYS 模块。 3.2 VC 调用模块 VC 调用模块在该系统中起着接受用户界面的输入、创建进程调用 ANSYS 模 块进行计算的重要作用。有两项工作是在实现在 VC 程序中调用 ANSYS 必 须做的,一是要使接口程序能够修改 ANSYSB 的命令流文件路径及文件名 称,这可通过注册表编程实现;二是要能在接口程序中运行 ANSYSB 应用程 序,这涉及到创建进程的编程,下面分别介绍它们的具体实现。 1. 注册表编程 在 Windows(98/NT/2000/XP)系统上运行 ANSYS 安装程序后,便在 Windows 系统的注册表里记录了一些信息,如初始工作路径,文件名等。利 用 VC 平台调用 ANSYS 计算模块的程序必须指定 ANSYS 软件的运行目录以 及用 APDL 语言开发的 ANSYS 模块程序路径,这样,ANSYS 软件的批处理 程序才能从给定的路径下读取命令流文件。在接口程序中修改这些注册表信 息,可以使用 Windows 提供的注册表编辑 API(Application Programming Interface)函数[30,31],具体实现如下: HKEY hSubKey; // 定义子键 LONG lRet; char RegPath[200]="SoftWare\\ANSYS, Inc.\\ANSYS\\ANSYS 6.1\\0"; lRet=RegOpenKeyEx(HKEY_CURRENT_USER,RegPath,0,KEY_ALL_AC CESS,&hSubKey); // 打开子键 if(lRet!=ERROR_SUCCESS)return; lRet=RegSetValueEx(hSubKey,"Extension",0,REG_SZ,(LPBYTE)"txt",3); // 设置 ANSYS 批处理程序读取的文件扩展名 if(lRet!=ERROR_SUCCESS)return; lRet=RegSetValueEx(hSubKey,"Jobname",0,REG_SZ,(LPBYTE)"ZHY"); //指定 ANSYS 模块文件名 if(lRet!=ERROR_SUCCESS)return; lRet=RegSetValueEx(hSubKey,"WorkingDirectory",0,REG_SZ,(LPBYTE)"E: \\LWS\\Workspace ",16); if(lRet!=ERROR_SUCCESS)return; // 键值出错返回 RegCloseKey(hSubKey); // 关闭子键 通过以上的设置后运行 ANSYS 批处理程序,界面变成如图 3-3 所示。 从图中可看出 ANSYS 模块工作路径 E:\\LWS\\Workspace、初始文件名 ZHY、ANSYS 程序文件名 ZHY.txt 文件、计算结果输出文件名 ZHY.out 都已 经自动出现在 ANSYS 批处理程序的输入框,往下 ANSYS 就可以自动从 ZHY.txt 读取命令流进行计算并将结果输出到 ZHY.out 文件中。若想改 ANSYS 模块路径或文件名只需对上面程序稍加修改即可。 2. 多进程编程 本文在 VC 平台上对 ANSYS 进行封装,希望前台处理系统和用户的交互, 而后台进行 ANSYS 的计算。这就要求系统具有并发性,为此,引入多进程
编程机制。进程是一个正在运行程序的实例,它具有动态性、并发性、独立 性、异步性和结构性等特点。系统中的进程动态产生与消亡,多个进程并发 运行,分别执行各自对应的程序段,为各自的目标而工作。一个程序可以包 含多个进程。 图 3-3 ANSYS 批处理运行界面 在 VC++6.0 中可以利用 CreateProcess 函数来创建一个进程去执行其他程 序,而且可以设置该进程的优先级。CreateProcess 函数的原型是: BOOL CreateProcess( LPCTSTR lpAppliciatonName LPTSTR lpCommandLine LPSECURITY_ATTRIBUTES lpProcessAttributes LPSECURITY_ATTRIBUTES lpThreadAttributes BOOL bInheritHandles DWORD dwCreationFlags LPVOID lpEnvironment LPCTSTR lpCurrentDirectory LPSTARTUPINFO lpStartupInfo LPPROCESS_INFORMATION lpProcessInformation ); 当系统调用 CreateProcess 时,会创建一个进程内核对象,其初始使用计数 是 1。该进程内核对象不是进程本身,而是操作系统管理进程时使用的一个 较小的数据结构。然后,系统为新进程创建一个虚拟地址空间,并将可执行 文件或任何必要的 DLL 文件的代码和数据加载到该进程的地址空间中。接 着,系统为新进程的主线程创建一个线程内核对象(其使用计数为 1)。与 进程内核对象一样,线程内核对象也是操作系统用来管理线程的小型数据结 构。通过执行 C/C++运行期启动代码,该主线程便开始运行,它最终调用 WinMain、wWinMain、main 或 wmain 函数。如果系统成功创建了新进程和 主线程,CreateProcess 便返回 True。 PszApplicationName 和 pszCommandLine 参数分别用于设定新进程将要使 用的可执行文件的名字和传递给新进程的命令行字符串。 PszApplicationName 的参数可以是 NULL,表示系统将使用全路径来查看可 执行文件,并且不再搜索这些目录;如果参数不是 NULL 可以将地址传递给 pszApplicationName 参数中包含可运行的文件的名字字符串。当系统找到了 可执行文件后,就创建一个新进程,并将可执行文件的代码和数据映射到新 进程的地址空间中。 PsaProcess 和 psaThread 参数分别设定进程对象和线程对象需要的安全 性。可以为这些参数传递 NULL,这种情况下,系统为这些对象赋予默认安 全性描述符;也可以指定两个 SECURITY_ATTRIBUTES 结构,并对它们进 行初始化,以便创建自己的安全性权限,并将它们赋予进程对象和线程对 象。将 SECRURITY_ATTRIBUTES 结构用于 psaProcess 和 psaThread 参 数的另一个原因是,父进程将来生成的任何子进程都可以继承这两个对象句 柄中的任何一个。本程序除了创键调用 ANSYS 计算模块的进程外,无需再 创建其它进程,因而,psaProcess 和 psaThread 参数都为 NULL。同理, binheritHandles 参数为 FALSE。
fdwCreate 参数用于标识标志,以便用于规定如何来创建新进程,fdwCreate 参数也可以用来设定优先级类,不过对于大多数应用程序来说不应该这样 做,因为系统会为新进程赋予一个默认优先级。 PszCurDir 参数允许父进程设置子进程的当前驱动器和目录。如果本参数为 NULL,则新进程的工作目录将与生成新进程的应用程序的目录相同;若不为 空,则必须指向包含需要的工作驱动器和工作目录的以 0 结尾的字符串。课 题中该参数选择为 NULL 就可以了。 PsiStartInfo 参数用于指向一个 STARTUPINFO 结构。当 Windows 创建新进 程时,它将使用该结构的有关成员。大多数应用程序将要求生成的应用程序 仅仅使用默认值。至少应该将该结构中的所有成员初始化为零,然后将 cb (cb 为 STARTUPINFO 结构成员)设置为该结构的大小。STARTUPINFO 结构的其他具体成员参见 VC++6.0 帮助系统 MSDN。 PpiProcInfo 参数用于指向你必须指定的 PROCESS_INFORMATION 结构。 CreateProcess 在返回之前要对该结构的成员进行初始化。该结构的形式如 下面所示: Typedef struct _PROCESS_INFORMATION{ HANDLE hProcess; HANDLE hThread; DWORD dwProcessId; DWORD dwThreadId; }PROCESS_INFORMATION; CreateProcess 在返回之前打开进程对象和线程对象,并将每个对象的与进 程相关的句柄放入 PROCESS_INFORMATION 结构的 hProcess 和 hThread 成员中。 综上所述,课题创建进程的关键程序如下: STARTUPINFO StartupInfo; PROCESS_INFORMATION ProcessInfo; memset(&StartupInfo,0,sizeof(STARTUPINFO)); //分配内存 StartupInfo.cb=sizeof(STARTUPINFO); // 初始化 StartupInfo.dwFlags=STARTF_USESHOWWINDOW; StartupInfo.wShowWindow=SW_SHOWMAXIMIZED; if(!::CreateProcess(NULL,d:\\ProgramFiles\\Ansys Inc\\ANSYS61\\bin\\intel\\AnsysB”,NULL,NULL,FALS E,0,NULL,NULL,&StartupInfo,&ProcessInfo)) { AfxMessageBox("error!"); GetLastError(); } // 创建进程 3. 进程的终止 要终止进程的运行可以使用如下四种方法:①主线程的进入点函数返回;② 进程中的一个线程调用 ExitProcess 函数;③另一个进程中的线程调用 TerminateProcess 函数;④所有进程中的线程自动终止运行(这种情况一般 不会发生)。本文采用第一种方法终止所创建的进程,即当 ANSYS 计算结束 时通过函数返回。
分享到:
收藏