的设置

我有一个PDF API其具有下文所定义的本机函数。

typdef void* PDF_DOCUMENT;
unsigned long PDF_GetMetaText(PDF_DOCUMENT document,
                              const char tag, 
                              void* buffer, 
                              unsigned long bufferlen)

//Calling it "natively" in C++/CLI function to get the PDF Creator tag
WCHAR result[32];
void* pdoc = PDF_LoadDoc("C:\test.pdf");
int numChars = PDF_GetMetaText(pdoc, "Creator", result, 32);
PDF_CloseDoc(pdoc);

如果我在C ++ / CLI包装函数调用上面的代码,它返回正确字符串,但将引发当我打电话PDF_CloseDoc一个AccessViolationException。 WOOPS。忘了pin_ptr指针的文件。

问题

当我pin_ptr PDOC,我可以成功地调用这些本地函数,但是缓冲不再包含我的字符串时PDF_GetMetaText回报。

String^ Wrapper::GetCreator(String^ filename)
{
   WCHAR buffer[32];
   void *pdoc = PDF_LoadDoc(SystemStringToCStr(filename));
   pin_ptr<void*> p = &pdoc; //added
   int numPages = PDF_GetMetaText(p, "Creator", buffer, 32);
   PDF_CloseDocument(p); //doesnt crash, but at this line buffer is an empty string

   return gcnew String(buffer);
}

我还试图钉扎缓冲器[0],但使一个accessviolation例外在GetMetaText。

问题

我不能说什么是GetMetaText发生的事情,所以我不知道什么是happing到PDOC。上述代码的任何建议?

有帮助吗?

解决方案

此不作任何意义。您只能销管理对象,PDF_LoadDoc的返回值()肯定不会看起来像一个管理对象给我。这同样适用于结果,它不是一个管理array<WCHAR>,是可以获得堆栈帧上分配只是一个普通的数组c。不幸的是,pin_ptr <>不抱怨。

结果阵列可以仅当代码被跺脚堆栈帧得到“空”。您可以通过在第一元件上设置数据断点诊断。 FWIW,SystemStringToCStr()看起来像一个候选人。这不可能不释放缓冲区为本地字符串地方工作。另一名候选人是PDF API函数声明。注重价值的ESP寄存器,并确保它不会改变。如果是这样,堆栈得到不平衡,因为你没有正确的调用约定。这通常是对于__stdcall DLL出口。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top