|
使用toolkit开发trigger的程序时,往往需要能够连续通过trigger来触发dll中的函数. : g r. x! |$ V/ `
我碰到的问题: 1 F. }6 t L# v7 p! V9 h# \
1.配置trigger:
; M1 q2 _0 I- y9 E. q Name: CimDll 2 O0 }) u' `" a, V4 _, W2 o c- e/ B
Event: Create PIV ( n+ ]; I+ Y( I# p) k
Time: POST ! h( H/ i' r& { _% f
RequireNO
9 t" R1 |. G; S7 a/ J6 w: T; y DLL:Cim.dll 5 {8 G& t% _8 \; q+ ~* C! V
Function DMTPIVCreatePostOperation . M. Y. @1 Z; i9 X% `
% _5 k3 |- q7 D' N$ y4 W# L. a 2.源代码:
1 D" ^/ r/ _% |; G5 ?% V$ R int PDMDLLInit()
7 L7 A/ }0 L# A) U8 G{ . S, K0 n3 {; O( @8 F8 X
PTCERROR pdm_status; ' a3 w7 F4 f3 H9 j3 U$ Q1 }# X
FILE *g_pfileLog; g_pfileLog =fopen("test.dat","w");
- H' Q! m. L+ v% V setbuf(g_pfileLog,NULL); * J2 W. d& T1 p' p7 G
fprintf(g_pfileLog,"begin test\n");
$ E+ _- D/ L. [ pdm_status = PDMTriggerRegister(" DMTPIVCreatePostOperation", PDMTPIVCreatePostOperation);
8 k7 R2 ^& n% {, j& } f/ x& [ if (pdm_status != PDM_SUCCESS) 8 {1 \6 S* k$ Y4 x! M w
{
/ \+ K: e$ J0 ~7 g printf("Failed to Register Trigger PIV Create Post.\n");
. \- U7 {& ^' [ }
% v' v* y+ k5 C+ A0 B# u6 j/ j7 F return (pdm_status);
! ~4 R* p/ s) L9 H}
+ H! X+ E# B4 G g6 `& }( [ Nint PDMTPIVCreatePostOperation(int argc, void **argv)
! K& f* ~& Y/ e5 p{ 6 X; J+ j, k/ n# }
fprintf(g_pfileLog,"test\n");
& c. g: n0 ]2 [' i' Y3 u .....
$ y$ h! p0 z3 u) K e fprintf(g_pfileLog,"end test\n"); # a9 i% I' ?# t
fclose(g_pfileLog);
3 z( m `) B: C% u}
/ s+ b3 k4 q! D; N 结果:以上代码存在的问题:如果我们在第一次checkin到C/S中后,删除test.dat文件,然后再进行checkin时,发现没有再生成test.dat,在函数PDMTPIVCreatePostOperation()中所进行的对文件的操作都无效.
9 y& l* Z6 e ]- Z5 O5 S* X/ o 原因:我们使用trigger触发时,真正起作用的是函数 DMTPIVCreatePostOperation(),而PDMDLLInit()只是在第一次checkin时起作用,所以在第一次调用PDMTPIVCreatePostOperation()后,我就fclose(g_pfileLog),所以出现了上面的情况.所以注意的是:不要把一些重要的东西放在函数PDMDLLInit()中. |
|