--TLS的关联请求应用
T_ASC_Network *net; // network initialization code not shown, T_ASC_Parameters *params; // we just assume these pointers to be valid // create TLS object that initializes the random generator through a file // \DcmTLSTransportLayer *tLayer = new DcmTLSTransportLayer( DICOM_APPLICATION_REQUESTOR, \
if (TCS_ok != tLayer->setPrivateKeyFile(\{
cerr << \return; }
if (TCS_ok != tLayer->setCertificateFile(\{
cerr << \return; }
// enable the TLS_RSA_WITH_3DES_EDE_CBC_SHA ciphersuite tLayer->setCipherSuites(SSL3_TXT_RSA_DES_192_CBC3_SHA); // accept any certificate from the remote site (not recommended) tLayer->setCertificateVerification(DCV_ignoreCertificate); // register and activate TLS layer
ASC_setTransportLayer(net, tLayer, 1); ASC_setTransportLayerType(params, 1); 十二、dcmwlm程序包
dcmwlm是一个设备工作表(Modality Worklist)数据库服务器。这个模块包含类,作为一个SCP,为实现DICOM Modality Worklist Management Service的应用提供支持。基于这些类的SCP可以从C-Find-RSP返回消息中找到相关信息。
主要接口:
--WlmActivityManager: This class encapsulates data structures and operations for basic worklist management service class providers. 在wlmactmg.h文件中定义。
--WlmDataSource: This class encapsulates data structures and operations for connecting to an arbitrary data source in the framework of the DICOM basic worklist management service. 在wlds.h文件中定义。
--WlmDataSourceFileSystem: This class encapsulates data structures and operations for connecting to a file-based data source in the framework of the DICOM basic worklist management service. 在wldsfs.h文件中定义。
--WlmFileSystemInteractionManager: This class encapsulates data structures and operations for managing data base interaction in the framework of the DICOM basic worklist management service. 在wlfsim.h文件中定义。
工具:
wlmscpfs: DICOM Basic Worklist Management SCP (based on data files) 举例:
For an example of how to use the main interface classes of this module, see file
'wlmscpfs.cc' (containing the main function of the corresponding tool) and file 'wlcefs.cc' (making use of the WlmActivityManager class that manages all activities a corresponding SCP has to manage).
十三、dcmqrdb程序包
dcmqrdb是一个图像数据库服务器。This module contains a simple image archive that manages a number of storage areas and allows images to be stored in these storage areas using the DICOM Storage Service Class. It also allows image attributes to be queried and images to be retrieved using the DICOM Query/Retrieve Service Class.
工具:
dcmqridx: Register a DICOM image file in an image database index file dcmqrscp: DICOM image archive (central test node) dcmqrti: The Terminal Initiator Telnet Client Program 文件:下面文件提供进一步信息。 --dcmqrcnf.txt:
http://blog.csdn.net/diqiucun666/archive/2008/09/02/2866908.aspx
基于DCMTK的DICOM相关程序编写攻略
前言: 由于现在的医学影像设备的图像存储和传输正在逐渐向DICOM标准靠拢,在我们进行医学图像处理的过程中,经常需要自己编写和DICOM格式的图像相关的各种程序模块,以完成自己处理功能。如果从头开始理解DICOM的协议,然后完全自己编写这些代码来实现这些协议,是一件工程浩大的事情。德国offis公司开发的DCMTK,为我们提供了实现DICOM协议的一个平台,使得我们可以在它的基础上轻松的完成自己的主要工作,而不必把太多的精力放在实现DICOM协议的细节问题上。本文以WINDOWSXP+VC6.0为开发平台,从DCMTK的下载、调试、使用等方面介绍基于DCMTK的DICOM相关程序编写过程。
三、基于DCMTK的DICOM相关程序。 1、建立自己的应用工程并将其加入DCMTK的工作空间(Project->Insert Project To WorkSpace)。 2、在自己的工程中加入需要使用的DCMTK静态库和头文件。 按照正确的顺序填写链接库文件(对于链接库来说顺序也是很重要的!) DCMTK库有下面这些依赖关系: dcmdata -》 ofstd dcmimage -》 dcmimgle, dcmdata, ofstd dcmimgle -》dcmdata, ofstd dcmjpeg -》ijg8, ijg12, ijg16, dcmimage, dcmimgle, dcmdata, ofstd dcmnet -》dcmdata, ofstd dcmpstat -》 dcmimage, dcmimgle, dcmsign, dcmsr, imagectn, dcmtls, dcmnet, dcmdata, ofstd dcmsign -》dcmdata, ofstd dcmsr -》dcmdata, ofstd dcmtls -》dcmnet, dcmdata, ofstd dcmwlm -》dcmnet, dcmdata, ofstd imagectn -》 dcmnet, dcmdata, ofstd 3、编译自己的工程。
4、不成功的可能有如下一些问题。 (1)对于单文档工程,运行时提示: generated debug assertion if (!ProcessShellCommand(cmdInfo)) return FALSE; -- File: docsingl.cpp Line: 215
原因:缺少AFX_IDS_UNTITLED的字符串
解决:在资源文件的STRING TABLE中加入 ID= AFX_IDS_UNTITLED的键值。 (2)编辑时提示:
fatal error C1189: #error : Please use the /MD switch for _AFXDLL builds 原因:
解决:在Project->Settings->Preprocessor definitions中去掉 _AFXDLL项。 (3)编译时提示:
LIBCMTD.lib(dbgheap.obj):error LNK2005: _malloc already defined in msvcrtd.lib(MSVCRTD.dll)
原因:由于VC在编译时试图从两个不同的库中写入同一个函数代码,只要忽略这些相冲突的默认库就可以解决。
解决:在Project->Settings->Link->Category->Input—>Ignore Liberies中加入 相应的msvcprtd.lib,msvcrtd.lib等。 另一种解决:保证自己的编译环境为: A)project->settings->c/c++->category->code generation的use run-time library 为debug multithreaded. B) 在Project->Settings->Preprocessor definitions中去掉 _AFXDLL项。 C)如果需要,在资源文件的STRING TABLE中加入 ID= AFX_IDS_UNTITLED的键值。 D)这样就不需要忽略那些库了。 还有可以:
后来尝试了很多方法,经过摸索,最后得出解决方法: 在Preprocessor中定义_AFXDLL
如果它提示:fatal error C1189: #error : Please use the /MD switch for _AFXDLL builds 就这样改:
C/C++->Code Generation->Multithread DLL (即实现/MD选项) (4)编译时提示:
dcmdata.lib(dcuid.obj) : error LNK2001: unresolved external symbol _Netbios@4 原因:缺少所需的链接库文件
解决:在自己的工程中加入需要使用的DCMTK静态库和头文件,并注意顺序。 (5)编译时提示:
fatal error LNK1181: cannot open input file。。。。。。。 Debug.obj 原因:类似错误,可能是由于目录中含有太长的中文名字。 解决:可以将中文的目录名改为英文就OK (6)运行时提示: 原因:
解决:在Project->Settings->Preprocessor definitions中去掉 _AFXDLL项。
(7)如果将已经make好的dcmtk目录复制到其它目录,则需要重新make,否则会出现一大堆路径错误 四、一个实际的例子 我们经常使用的DICOM主要是读和写DICOM文件。下面以读写DICOM为例DCMTK的使用方法。
五、其它一些相关的问题 1、把DCMTK当作静态库使用:DCMTK本身提供的是静态库即Lib,在链接进自己的工程时会将全部的函数加入,因此造成可执行文件很大,而且不便于升级;如果需要使用DCMTK作为动态库链接,需要自己建立相应的Dll工程,然后把原来的程序文件加进来,再写一个导出函数的文件,这些导出函数保持固定。这样其它地方使用的时候不会因为动态库程序升级又重新编译。
编译DCMTK
也许是DCMTK的开发人员认为DCMTK是一个专用的库,没有必要做成动态链接库。也许是DCMTK的开发人员认为DCMTK需要跨平台,做成动态链接库就平台相关了,违背了跨平台的本意。
所以,如此两个也许只有,DCMTK经过编译之后总是得不到DLL文件。DCMTK到底能不能编译成DLL来使用呢?反正我是失败了。你来试试。不过在编译DCMTK的过程中也解决了不少棘手问题。不感独享。
我用的编译环境是VC8(就是VS2005)里面的VC。我们编译的目的是使DCMTK能和我们现在使用的MFC协作良好。我们学习都是螺旋渐进式学习的(提出结论,然后推翻结论,得出新结论),我们也这样。 结论一:
使用VC编写程序,总是离不开字符串,需要使用字符串CString。而VC呢?又支持各种不同的字符串编码。那么CMake创建的DCMTK项目,里面默认的什么字符串编码呢?好象VC8向导创建的项目,默认就是Unicode,而不是MBCS哦。正好相反,需要注意。CMake创建的DCMTK项目里面都使用的MBCS字符集。那么以后使用VC编写DCMTK应用程序的时候,还是使用MBCS字符集吧。毕竟DCMTK太大了,修改起来不太方便。以后,我们就不讨论Unicode版本的应用程序啦,只考虑使用MBCS的应用程序。 结论二:
DCMTK只能编译成静态连接库。
为什么呢?因为我们按照默认的办法编译DCMTK之后,找不到任何DLL哦。全部是一大堆的LIB文件和.H文件。 结论三:
VC书写的程序都需要使用C语言运行库(里面实现了标准的C语言函数哦,比如IOSTREAM等东西)。 结论四:
C语言运行库的引如方式有两种。与MFC的用法一样,有动态链接的方式和静态链接的方式。也就是编译参数/MT /MTd /MD /MDd负责控制啦。 /MT负责链接发行版的C语言运行库(静态链接)。 /MTd负责链接调试版的C语言运行库(静态链接)。 /MD负责链接发行版的C语言运行库(动态链接)。 /MDd负责链接调试版的C语言运行库(动态链接)。