如题在Webservice中调用该方法时候出现”尝试读取或写入受保护的内存。这通常指示其他内存已损坏。“
1.该代码在本地服务器和本地机子上均无出现上述情况,只在发布的服务器上出现win2003
2.PDF IFilter 6.0插件已经安装,除了pdf其他格式如office格式均可正确读取文件内容
3.利用编写window forms简易程序测试Parser.parse("Pdf文件")时候能正确读取内容,但是在关闭应用程序后出现font capture 应用程序错误 0x03cf61b3 0x047223e8 内存不能读
上述异常只在读取pdf文件时候出现,其他格式均正常
Parse类如下
各位达人看见的话多提提意见
2 {
3 public Parser()
4 {
5 }
6
7 [DllImport("query.dll", CharSet = CharSet.Unicode)]
8 private extern static int LoadIFilter(string pwcsPath, ref IUnknown pUnkOuter, ref IFilter ppIUnk);
9
10 [ComImport, Guid("00000000-0000-0000-C000-000000000046")]
11 [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
12 private interface IUnknown
13 {
14 [PreserveSig]
15 IntPtr QueryInterface(ref Guid riid, out IntPtr pVoid);
16
17 [PreserveSig]
18 IntPtr AddRef();
19
20 [PreserveSig]
21 IntPtr Release();
22 }
23
24
25 private static IFilter loadIFilter(string filename)
26 {
27 IUnknown iunk = null;
28 IFilter filter = null;
29
30 // Try to load the corresponding IFilter
31 int resultLoad = LoadIFilter(filename, ref iunk, ref filter);
32 if (resultLoad != (int)IFilterReturnCodes.S_OK)
33 {
34 return null;
35 }
36 return filter;
37 }
38
39 /*
40 private static IFilter loadIFilterOffice(string filename)
41 {
42 IFilter filter = (IFilter)(new CFilter());
43 System.Runtime.InteropServices.UCOMIPersistFile ipf = (System.Runtime.InteropServices.UCOMIPersistFile)(filter);
44 ipf.Load(filename, 0);
45
46 return filter;
47 }
48 */
49
50 public static bool IsParseable(string filename)
51 {
52 return loadIFilter(filename) != null;
53 }
54
55 public static string Parse(string filename)
56 {
57 IFilter filter = null;
58
59 try
60 {
61 StringBuilder plainTextResult = new StringBuilder();
62 filter = loadIFilter(filename);
63
64 STAT_CHUNK ps = new STAT_CHUNK();
65 IFILTER_INIT mFlags = 0;
66
67 uint i = 0;
68 filter.Init(mFlags, 0, null, ref i);
69
70 int resultChunk = 0;
71
72 resultChunk = filter.GetChunk(out ps);
73 while (resultChunk == 0)
74 {
75 if (ps.flags == CHUNKSTATE.CHUNK_TEXT)
76 {
77 uint sizeBuffer = 60000;
78 int resultText = 0;
79 while (resultText == Constants.FILTER_S_LAST_TEXT || resultText == 0)
80 {
81 sizeBuffer = 60000;
82 System.Text.StringBuilder sbBuffer = new System.Text.StringBuilder((int)sizeBuffer);
83 resultText = filter.GetText(ref sizeBuffer, sbBuffer);
84
85 if (sizeBuffer > 0 && sbBuffer.Length > 0)
86 {
87 string chunk = sbBuffer.ToString(0, (int)sizeBuffer);
88 plainTextResult.Append(chunk);
89 }
90 }
91 }
92 resultChunk = filter.GetChunk(out ps);
93 }
94 return plainTextResult.ToString();
95 }
96 catch (Exception ex)
97 {
98 return ex.Message;
99 }
100 finally
101 {
102 if (filter != null)
103 Marshal.ReleaseComObject(filter);
104 }
105 }
106 }