我们都知道动态链接MFC的时候,应用程序运行时会要求提供MFC对应的DLL。
VC6的需要MFC4.2的DLL。调试版的程序会自动引入MFC42D.DLL。发行版的会自动引入MFC42.DLL。MFC42U.DLL呢?(那是Unicode版本的MFC,前面都说啦,不讨论了)。VC8提供的DLL形式的MFC又是另外一个模样,叫做MFC80.DLL。 结论五:
DCMTK使用的是静态链接方式链接语言运行库。使用默认的DCMTK编译参数,生成的LIB文件。在使用的时候,需要注意以下问题。 ①需要设置项目的字符类型为MBCS,可以判断有没有定义文本宏_MBCS; ②需要设置项目使用语言运行库的方法为静态链接,可以判断有没有定义文本宏(_MDd,_MD,_MT,MTt); ③需要静态链接MFC,可以判断有没有定义文本宏(_AFXDLL); ④需要链接很多库,可以通过在源文件中编写代码实现, 提高重用度 #pragma comment(lib,\ #pragma comment(lib,\ #pragma comment(lib,\ #pragma comment(lib,\ #pragma comment(lib,\ #pragma comment(lib,\ #pragma comment(lib,\ #pragma comment(lib,\ #pragma comment(lib,\ #pragma comment(lib,\ #pragma comment(lib,\ #pragma comment(lib,\ #pragma comment(lib,\ #pragma comment(lib,\ #pragma comment(lib,\ #pragma comment(lib,\ #pragma comment(lib,\。 结论六:
按照结论五编写出来的应用程序是很大的。但是独立性和完整性都最好。我写了个简单的Demo。调试版的大小是4.05M,发行版的大小是1.10M。但是复制到什么地方都可以运行,根本不需要其它额外的动态连接库。 结论七:
有时必须调整DCMTK链接语言运行库的方式(变静态链接为动态链接)。
比如,要写扩展MFC的DLL时,就必须采用动态链接的方式使用MFC。VC要求,采用动态链接的方式使用MFC就必须采用用动态链接的方式使用语言库。如果DCMTK采用静态方式链接语言库,使用DCMTK的程序采用动态方式链接,那么就会出现语言库中的符号符号重复定义的情况。怎么办呢?能不能在最后链接的时候在统一指定语言库的使用方式呢?这个我测试了,好象不行。哪位大侠搞定了通知我下。我采用的办法是重新编译DCMTK。修改其语言库链接方式。如何操作呢?
替换所有CMakeLists.txt中的/MT为/MD (根据经验其实也就根目录下的CMakeLists.txt中存在)。重新编译DCMTK。这样一来,我们的程序就可以采用动态链接的方式使用MFC了。
这次编译出来的程序,大小还可以。我把需要用到的功能用MFC扩展的DLL进行了包装。调试版本的DCMTK.DLL大小为1.92M;发行版本的DCMTK.DLl大小为884K;调试版本的Demo.EXE文件大小为152K;发行版本的Demo.EXE大小为48K。其实DCMTK.DLL的维护完全可以安排一个专人负责。一般调试完毕之后,变化是很少的。如此以来,调试程序的时候,编译速度快多了
转载自:http://blog.csdn.net/jackmacro/archive/2010/02/27/5332665.aspx
有关DCMTK的基础知识
来自:PACS专家网 (http://www.pacser.net/index.asp)
作者:jayition由于我对worklist的了解只是初步的,所以在我说的有错误之处还要大家多多指点;worklist我把它译为工作列表,它的作用是方便检查医师,减少检查医师的输入;病人信息在登记过之后就会产生一个列表,是所有没有经过拍片的病人信息列表,并提供一个服务,供设备来调用、当病人拿着一个登记号之类的编码到相对应的拍片室之后,拍片医师会将一小部分信息输入(例如登记号)、 设备根据登记号向SCP提出请求(C-FIND),
SCP根据请求内容查找列表,将相应的信息返回给设备。 设备读取病人信息-》拍片-》。。。。。。(后面的事与工作列表服务关系就不太大了) 以上这些是它的大概流程!
由于我主要是用DCMTK进行研究,所以说明一下它现在所支持的一些信息:
在请求中,它支持以下字段(我用数据库来理解DICOM的,所以我习惯叫它们字段) (0008,0050) AccessionNumber 工作流号
(0008,0090) ReferringPhysiciansName 提交人(医师)名字 (0010,0010) PatientsName 病人姓名 (0010,0020) PatientID 病人ID (0010,0040) PatientsSex 病人性别
(0032,1032) RequestingPhysician 请求医师 (0038,0010) AdmissionID 允许进入ID
(0040,0100) ScheduledProcedureStepSequence 安排程序序列 (0008,0060) > Modality 设备样式(设备名:如CT,CR等) (0040,0001) > ScheduledStationAETitle 预定工作站的应用实体名 (0040,0002) > ScheduledProcedureStepStartDate 预定的操作日期 (0040,0003) > ScheduledProcedureStepStartTime 预定的操作时间 (0040,0006) > ScheduledPerformingPhysiciansName 检查医生姓名 (0040,1001) RequestedProcedureID 被请求的程序ID
(0040,1003) RequestedProcedurePriority 被请求过程的优先权 支持以下返回信息:
(0008,0005) SpecificCharacterSet (0008,0050) AccessionNumber (0008,0080) InstitutionName (0008,0081) InstitutionAddress
(0008,0090) ReferringPhysiciansName
(0008,1080) AdmittingDiagnosesDescription (0008,1110) ReferencedStudySequence
(0008,1150) > ReferencedSOPClassUID (0008,1155) > ReferencedSOPInstanceUID (0008,1120) ReferencedPatientSequence (0008,1150) > ReferencedSOPClassUID (0008,1155) > ReferencedSOPInstanceUID (0010,0010) PatientsName (0010,0020) PatientID
(0010,0030) PatientsBirthDate (0010,0040) PatientsSex (0010,1000) OtherPatientIDs (0010,1001) OtherPatientNames (0010,1020) PatientsSize (0010,1030) PatientsWeight (0010,1040) PatientsAddress (0010,1080) MilitaryRank (0010,2000) MedicalAlerts (0010,2110) ContrastAllergies (0010,2160) EthnicGroup (0010,21a0) SmokingStatus
(0010,21b0) AdditionalPatientHistory (0010,21c0) PregnancyStatus (0010,21d0) LastMenstrualDate (0010,4000) PatientComments (0020,000d) StudyInstanceUID (0032,1032) RequestingPhysician (0032,1033) RequestingService
(0032,1060) RequestedProcedureDescription (0032,1064) RequestedProcedureCodeSequence (0008,0100) > CodeValue
(0008,0102) > CodingSchemeDesignator (0008,0103) > CodingSchemeVersion (0008,0104) > CodeMeaning (0038,0010) AdmissionID
(0038,0011) IssuerOfAdmissionID (0038,0050) SpecialNeeds
(0038,0300) CurrentPatientLocation (0038,0500) PatientState
(0040,0100) ScheduledProcedureStepSequence (0008,0060) > Modality
(0032,1070) > RequestedContrastAgent (0040,0001) > ScheduledStationAETitle
(0040,0002) > ScheduledProcedureStepStartDate (0040,0003) > ScheduledProcedureStepStartTime (0040,0004) > ScheduledProcedureStepEndDate
(0040,0005) > ScheduledProcedureStepEndTime (0040,0006) > ScheduledPerformingPhysiciansName (0040,0007) > ScheduledProcedureStepDescription (0040,0008) > ScheduledProtocolCodeSequence (0008,0100) > > CodeValue
(0008,0102) > > CodingSchemeDesignator (0008,0103) > > CodingSchemeVersion (0008,0104) > > CodeMeaning
(0040,0009) > ScheduledProcedureStepID (0040,0010) > ScheduledStationName
(0040,0011) > ScheduledProcedureStepLocation (0040,0012) > PreMedication
(0040,0020) > ScheduledProcedureStepStatus
(0040,0400) > CommentsOnTheScheduledProcedureStep (0040,1001) RequestedProcedureID
(0040,1002) ReasonForTheRequestedProcedure (0040,1003) RequestedProcedurePriority (0040,1004) PatientTransportArrangements (0040,1005) RequestedProcedureLocation (0040,1008) ConfidentialityCode (0040,1009) ReportingPriority
(0040,1010) NamesOfIntendedRecipientsOfResults (0040,1400) RequestedProcedureComments
(0040,2001) ReasonForTheImagingServiceRequest (0040,2004) IssueDateOfImagingServiceRequest (0040,2005) IssueTimeOfImagingServiceRequest (0040,2008) OrderEnteredBy
(0040,2009) OrderEnterersLocation
(0040,2010) OrderCallbackPhoneNumber
(0040,2016) PlacerOrderNumberImagingServiceRequest (0040,2017) FillerOrderNumberImagingServiceRequest (0040,2400) ImagingServiceRequestComments
(0040,3001) ConfidentialityConstraintOnPatientDataDescription 好的,下面为了更好地理解worklist服务,如果有一个环境来大概看一下!所以我用DCMTK中的例子程序来看这个过程,(由于我也没有看见过正真的环境,经过mouse及各位网友指点我就先把我理解的写出来了!如有错误望指点!)
在设备端可以理解为一个findscu程序(是DCMTK中的例程。)而响应这个程序的服务是wlmscpfs--相当于服务器端!findscu发送一个请求到服务器端wlmscpfs,wlmscpfs通过文件数据服务器(暂时这么叫,也可以叫文件数据库,因为它的每一条记录对应于一个文件!)查找,并返回结果!
接下来,为了更清晰这个结构,我将编译好的dump2dcm.exe,findscu.exe,wlmscpfs.exe,还有dcmtk目录下的\\\\dcmwlm\\\\wlistdb和dcmwlm\\\\wlistqry拷到一个自已定义的目录下,这里假设是d:\\\\dcmtk,再按这两个文件夹里面的readme的要求,将原来的dump文件转化为dcm格式,扩展名分别为wl和dcm,这个说明里已经讲清楚了!