尝试读取或写入受保护的内存。这通常指示其他内存已损坏。问题
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "stdafx.h"
#include "mfcpch.h"
#include "allheaders.h"
#include "baseapi.h"
#include "strngs.h"
#include "params.h"
#include "blobs.h"
#include "notdll.h"
extern "C" __declspec(dllexport) int donetapi(char * imagepath,char * output, char * lang, int psm)
{
tesseract::PageSegMode pagesegmode = tesseract::PSM_AUTO;
pagesegmode = static_cast<tesseract::PageSegMode>(psm);
tesseract::TessBaseAPI api;
api.Init(imagepath, lang, tesseract::OEM_DEFAULT,
NULL, 0, NULL, NULL, false);
if (api.GetPageSegMode() == tesseract::PSM_SINGLE_BLOCK)
api.SetPageSegMode(pagesegmode);
FILE* fin = fopen(imagepath, "rb");
if (fin == NULL) {
return -1;
}
fclose(fin);
PIX *pixs;
if ((pixs = pixRead(imagepath)) == NULL) {
return -1;
}
pixDestroy(&pixs);
STRING text_out;
if (!api.ProcessPages(imagepath, NULL, 0, &text_out)) {
return -1;
}
STRING outfile = output;
FILE* fout = fopen(outfile.string(), "wb");
if (fout == NULL) {
return -1;
}
fwrite(text_out.string(), 1, text_out.length(), fout);
fclose(fout);
return 0;
}
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
============================
以上是 tesseract 开源的文字识别的软件源码里面添加的,我是把这个生成了DLL,然后在C#里面调用的。
C#里面:
[DllImport("tessdll.dll")]
public unsafe static extern int donetapi(string imagepath, string output, string lang, int psm);
每次调用的时候,就老是提示这个问题,尝试读取或写入受保护的内存。这通常指示其他内存已损坏。偶尔能够顺利通过。
------解决方案--------------------
C# code
/// Return Type: int
///imagepath: char*
///output: char*
///lang: char*
///psm: int
[System.Runtime.InteropServices.DllImportAttribute("<Unknown>", EntryPoint="donetapi")]
public static extern int donetapi(System.IntPtr imagepath, System.IntPtr output, System.IntPtr lang, int psm) ;