COM+预研总结(4)

(1)定义COM对象为单一实例。
DECLARE_CLASSFACTORY_SINGLETON(CPatient),
DECLARE_CLASSFACTORY_SINGLETON宏定义COM对象为单一实例。
在配置COM+对象属性激活上下文中的属性有关(不要选中组件支持事件和数据统计)


(2)COM对象线程模型为Both,支持COM+服务器多线程访问该对象,注意对象的成员对象的线程安全性。

 

(3)创建工程时合并PROXY/STUB。

 

(4)COM对象中每启动新线程要初始化COM套件
 ::CoInitializeEx( NULL, COINIT_MULTITHREADED );
启动多线程套间。这样事件通知等就不用边界调整。一个进程中最多只有一个多线程套件,所以所有进入多线程套件的线程其实都在一个套件当中,互相访问不用条件调整。

 

(5)由于要配置成COM+服务,所以必须考虑到跨边界访问问题。
所有事件接口都直接继承IUnknown接口,因为我们肯定只用VC++访问,不需要定义成IDispatch接口。
为了开发方便,是否跨边界要透明。所以接口要支持结构体、指针、数组等。
跨边界调整要通过默认调整规则。
接口定义如下:
HRESULT OnGetAllAlarmBrief([in] LONG lPatientiID, [in,size_is(lCount),unique] struct STUAlarmBrief * pstuAlarmBrief, [in] LONG lCount,。。。);

size_is(lCount)属性定义调整pstuAlarmBrief数组有多长。
unique属性定义pstuAlarmBrief为指针,并且可以为空(ref属性是不可以为空的)(unique、ref、ptr区别参考MSDN)。

接口中参数若为结构体,并且结构体中含有指针,要像面定义
struct STU_STREVIEW_DATA_INFO_SHORTTREND
{
    。。。
      [unique, size_is(lTrenddataCount)]struct STUParamShortTrend *parrTrendInfo;   

      long lTrenddataCount;     
      。。。
};

//若不是数组,可以不用size_is(lTrenddataCount)属性,规则和上述结构说明相同

 

(6)内存管理问题:
[in]属性是谁调用谁释放,[out]属性是谁调用谁释放,但调用端要事先分配好内存。
尽量不要使用[retval]属性,特别是参数是复杂结构体时(例如结构体变量中有VARIANT类型时,可能引发不可预知的问题)。
 
(7)要注意VARIANT类型,一定要先初始化(VariantInit),用过后释放(VariantClear)。否则可能出现异常(没有调用VariantInit的参数),或内存泄露(没有VariantClear)。


通过这些学习到了分布式编程的思想,COM确实很复杂,不过功能还是很强大的,很多东西了解了机制,可以根据实际需要修改,提升方便性和性能。可以实现不改动代码只通过配置就可以实现单机版和服务器版软件。很可惜,没有见到最终的成果。

<think>好的,用户的问题是关于在Java中解析或处理Markdown代码块的方法和示例。我需要根据用户提供的引用资料来回答这个问题。首先,用户提供的引用中有几个相关的,比如引用[2]提到的Java Markdown生成器,引用[3]提到的react-showdown(虽然这是React的,但可能底层用了Showdown),还有引用[4]提到的Java Markdown生成器项目。不过,可能用户更关注的是解析Markdown代码块,而不仅仅是生成。 我需要确认用户的需求是解析Markdown中的代码块,可能是指提取代码块内容,或者进行语法高亮等处理。常见的Java有哪些呢?比如CommonMark-java是一个流行的Markdown解析,支持CommonMark规范。还有Flexmark-java,功能比较强大,支持扩展。另外,引用[4]提到的Java Markdown生成器可能也具备解析功能,但需要进一步确认。 接下来,我需要给出具体的推荐,并附上示例代码。例如,使用CommonMark-java来解析Markdown,并提取代码块。首先,添加Maven依赖,然后编写代码,使用解析器遍历AST,找到代码块节点。同时,可能还需要提到其他如Flexmark-java,展示不同的实现方式。此外,引用[2]中提到的Java笔记里可能有相关的Markdown处理语法,但具体到代码块解析可能需要更具体的。 还要注意用户可能的深层需求,比如处理代码块中的语法高亮,这时候可能需要结合其他,比如Prism.js或Highlight.js,但Java中可能通过服务端渲染实现。不过用户的问题更偏向解析,所以重点应放在提取代码块内容上。 最后,生成相关问题,引导用户进一步探索,比如如何处理Markdown中的其他元素,推荐其他工具,或者性能优化等。</think>在Java中解析Markdown代码块,推荐使用以下开源及实现方法: ### 一、CommonMark-java 基于CommonMark规范的解析器,支持最新GFM扩展(GitHub Flavored Markdown),可精准定位代码块: ```java import org.commonmark.node.*; import org.commonmark.parser.Parser; public class CodeBlockExtractor { public static void main(String[] args) { Parser parser = Parser.builder().build(); Node document = parser.parse("```java\nSystem.out.println();\n```"); document.accept(new AbstractVisitor() { @Override public void visit(FencedCodeBlock codeBlock) { System.out.println("语言:" + codeBlock.getInfo()); System.out.println("代码内容:" + codeBlock.getLiteral()); } }); } } ``` 此方法通过访问者模式遍历AST语法树,准确提取围栏代码块(```)信息[^2]。 ### 二、Flexmark-java 支持完整Markdown特性且高度可扩展的方案: ```java import com.vladsch.flexmark.ext.gfm.strikethrough.StrikethroughExtension; import com.vladsch.flexmark.util.ast.Node; import com.vladsch.flexmark.util.data.MutableDataSet; public class AdvancedParser { public static void main(String[] args) { MutableDataSet options = new MutableDataSet(); options.set(Parser.EXTENSIONS, List.of(StrikethroughExtension.create())); Parser parser = Parser.builder(options).build(); Node document = parser.parse("```python\nprint('Hello')\n```"); // 使用自定义访问器处理节点 new NodeVisitor(new VisitHandler<>(FencedCodeBlock.class, node -> { System.out.println("检测到代码块:" + node.getContent().toString()); })).visit(document); } } ``` 该方案支持130+扩展插件,可处理复杂文档结构[^4]。 ### 三、Markdown4j 轻量级解决方案适合基础需求: ```xml <dependency> <groupId>org.markdown4j</groupId> <artifactId>markdown4j</artifactId> <version>2.2</version> </dependency> ``` ```java import org.markdown4j.Markdown4jProcessor; String html = new Markdown4jProcessor().process("`inline code`"); ``` 此可将Markdown转换为HTML,通过DOM操作提取代码块。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值