读书人

vc2008 ATL 线程模型:单元跟自由的区

发布时间: 2012-12-17 09:31:40 作者: rapoo

vc2008 ATL 线程模型:单元和自由的区别
在ATL工程中添加2个类,都是ATL简单对象,一个线程模型是单元,一个是自由。
分别加入同一个方法:
fun_test(CHAR* cin, CHAR* cout)
{
// TODO: 在此添加实现代码
strcpy(cout, cin);

return S_OK;
}

在另一个程序中调用:
CHAR chin[255]={0};
CHAR chout[255]={0};

strcpy_s(chin,255,"1234567890");

test->fun_test(chin,chout);

线程模型是单元的结果:chout:"1234567890"
线程模型是自由的结果:chout:"1"

通过调试dll发现:
线程模型是单元的传入参数cin:"1234567890"
线程模型是自由的传入参数cin:"1"


请问:
1:一般情况下,在ATL中创建的类是什么类型?ATL简单对象还是其他的? 20分
2:一般情况下,在ATL中创建的类的线程模型,选什么??对应什么情况? 20分
3:上述例子2种情况下的不同结果,原因是什么?? 20分
4:你写COM接口是使用ATL吗?否则怎么写?? 20分
5:另加20分酌情加分 20分

[最优解释]
1 看需要,一般都用简单对象就够了
2 我都是用STA
3 CHAR*的话 就是1个字符,字符串应该使用BSTR
4 ATL

这个问题比较复杂 《深入解析ATL》中有详细的解释。
[其他解释]
简单的说 单元 的话就是 多线程调用你的com的时候需要 列集与散集,COM保证只有一个线程会调用对象方法。
自由 的话就是可以在多个线程中 直接调用方法,对象内部处理多线程并发问题。

char* long*之类的 都是只有一个元素是正确的,后面的内容是无法保证是你所期望的。

数组使用SAVEARRAY ,字符串BSTR。
[其他解释]

引用:
1 看需要,一般都用简单对象就够了
2 我都是用STA
3 CHAR*的话 就是1个字符,字符串应该使用BSTR
4 ATL

这个问题比较复杂 《深入解析ATL》中有详细的解释。


STA创建的接口,调用程序是不是不能在线程中调用??就是说调用程序开个线程调用fun_test方法??
[其他解释]
引用:
引用:1 看需要,一般都用简单对象就够了
2 我都是用STA
3 CHAR*的话 就是1个字符,字符串应该使用BSTR
4 ATL

这个问题比较复杂 《深入解析ATL》中有详细的解释。

STA创建的接口,调用程序是不是不能在线程中调用??就是说调用程序开个线程调用fun_test方法??

可以啊,只不过比较麻烦,需要 列集与散集
[其他解释]
可以啊,只不过比较麻烦,需要 列集与散集
-------
那为什么一般创建STA的,自由的不是更方便些吗??按您说的,STA比较麻烦,需要 列集与散集
自由的有什么不好的地方??
[其他解释]
CHAR*的话 就是1个字符,字符串应该使用BSTR
-----------
那什么情况下用CHAR*??
[其他解释]
引用:
可以啊,只不过比较麻烦,需要 列集与散集
-------
那为什么一般创建STA的,自由的不是更方便些吗??按您说的,STA比较麻烦,需要 列集与散集
自由的有什么不好的地方??

调用者麻烦一些。写COM的容易一些,不需要加锁解锁。
[其他解释]
引用:
CHAR*的话 就是1个字符,字符串应该使用BSTR
-----------
那什么情况下用CHAR*??


我能想到的也就这么用[retval,out]char*

读书人网 >VC/MFC

热点推荐