GIT의 위대한 VFR PDF 뷰어에서 ObjC 코드 조각이 있습니다. CGPDFDictionaryGetString
을 사용하여 PDF 주석에서 문자열에 대한 포인터를 가져옵니다. 그런 다음 최종 포인터를 얻기 위해 일부 바이트 포인터 변환을 사용합니다. Monotouch에는 이 없지만 .GetName()
만 있습니다. 이것은 문자열을 반환하는 유일한 방법이므로 올바른 방법이어야한다고는 생각되지만 작동하지 않습니다. 배열, 사전, 수레 및 정수를 검색 할 수 있습니다. 문자열 만 작동하지 않는 것 같습니다.이 CGPDFDictionaryGetString은 어떻게 Monotouch로 변환됩니까?
아래의 작은 코드 예를 참조하십시오. >를 반환 -하여 GetString가 : // TODO : 나는 마스터 지점에서 볼 수 모노 소스를 보면 :
string sUri = null; // This returns FALSE. Hence my sUri is NULL. Seems like GetName() is not the analogy to CGPDFDictionaryGetString. if(oActionDic.GetName("URI", out sUri)) { // I never get here. }
편집
가 :CGPDFStringRef uriString = NULL;
// This returns TRUE in the ObjC version and uriString is a valid pointer to a string.
if (CGPDFDictionaryGetString(actionDictionary, "URI", &uriString) == true)
{
// Do some pointer magic - how to do this in MT? Do I have to at all?
const char *uri = (const char *)CGPDFStringGetBytePtr(uriString);
// *uri now contains a URL, I can see it in the debugger.
}
나는 그런 식으로 번역 CGPDFString
브랜치 4.2로 전환하면 해당 브랜치가있는 것으로 나타납니다. 그래서 거기에서 코드를 복사했지만 두 가지 문제가 있습니다 :
- "안전하지 않은"키워드에 대해 오류가 발생합니다. 그것은 "안전하지 않은"명령 행 옵션을 추가하라고 알려줍니다. 그것은 무엇이며 그것을 추가하는 것이 좋은 생각입니까? 어디에?
- 어쨌든 실행되는 것처럼 보이지만 CGPDFString을 가져올 때 응용 프로그램이 멈 춥니 다.
[같이 DllImport (Constants.CoreGraphicsLibrary)] 공개 통근 정전기를 IntPtr CGPDFStringGetLength (pdfStr을 IntPtr); 당신이 당신의 소스에 안전하지 않은 키워드를 사용하는 경우
[DllImport (Constants.CoreGraphicsLibrary)]
public extern static IntPtr CGPDFStringGetBytePtr (IntPtr pdfStr);
public static string PdfStringToString (IntPtr pdfString)
{
if (pdfString == IntPtr.Zero)
return null;
int n = (int)CGPDFStringGetLength (pdfString);
unsafe
{
return new String ((char *)CGPDFStringGetBytePtr (pdfString), 0, n);
}
}
[DllImport (Constants.CoreGraphicsLibrary)]
extern static bool CGPDFDictionaryGetString (IntPtr handle, string key, out IntPtr result);
public static bool GetStringFromPdfDictionary (CGPDFDictionary oPdfDic, string key, out string result)
{
if (key == null)
throw new ArgumentNullException ("key");
IntPtr res;
if (CGPDFDictionaryGetString (oPdfDic.Handle, key, out res))
{
result = PdfStringToString (res);
return true;
}
result = null;
return false;
}
안전하지 않은 이유는 무엇입니까? 필요없는 것처럼 보입니다. –
그리고 안전하지 않은 블록에서만 허용되는 포인터 연산 대신 무엇을합니까? – Krumelur
'Marshal' 클래스를 사용하여 null로 끝나는 문자열을 .net 문자열 –