C#调用C++dll文件的问题,着急,请各位高手帮忙!
我调用两个c++写的dll文件。
readdic.dll中有两个函数:
int read_forbid_dic (char *forbid_dic_name, ForbidWord forbid_dic_head);将禁用词典从外存读入内存,若读取成功则返回读入的单词最大词长,反之,若读取失败则返回-1。参数说明:char * forbid_dic_name 用户禁用词典的路径。ForbidWord forbid_dic_head 禁用词典在内存中的保存地址。
int read_keyword_dic (char *keyword_dic_name, KeyWord keyword_dic_head);将关键词词典从外存读入内存,若读取成功则返回读入的单词最大词长,反之,若读取失败则返回-1。参数说明:char * keyword_dic_name 用户关键词词典的路径。KeyWord keyword_dic_head 关键词词典在内存中的保存地址。
summary_e.dll中一个函数:
char *_english_entry_summary(char *document, int summary_size, ForbidWord forbid_dic_head, KeyWord keyword_dic_head);功能:_english_entry_summary核心部分,根据用户提供的词典和文本内容进行自动摘要,返回值为英文摘要的地址。参数说明:char *document用户提供的文章内容的内存地址。int summary_size摘要的大小(用户可自行设定)。ForbidWord forbid_dic_head 禁用英文词典的内存地址。KeyWord keyword_dic_head 关键词词典的内存地址。
现在我在vc6中能够成功调用这两个dll,代码如下:
头文件wordstruct.h的内容为:
typedef struct word
{
long high; //高八位
long low; //低八位
float sig; //词权值
word *next; //下一个词
}*Word;
#define MAX_WORD_LEN_E_K 20
typedef struct keyword
{
char word[MAX_WORD_LEN_E_K];
int weight;
keyword *next;
}*KeyWord;
typedef struct forbidword
{
char word[MAX_WORD_LEN_E_K];
forbidword* next;
}* ForbidWord;
cpp文件:
#include <wtypes.h> //加载动链接库时使用
#include <winbase.h> //加载动链接库时使用
#include "wordstruct.h" //包含必要的结构体
char document[409600]; //指向要提取摘要的内容
char *forbid_dic_path="forbid_dic.txt"; //禁用词典路径
char *keyword_dic_path="keyword_dic.txt"; //关键词词典路径
char *summary; //摘要保存地址
ForbidWord forbid_dic_head;
KeyWord keyword_dic_head;
void CMy0907Dlg::OnOK()
{
/*************************初始化词典****************************/
forbid_dic_head = (ForbidWord)malloc(sizeof(struct forbidword));
forbid_dic_head->next =NULL;
keyword_dic_head = (KeyWord)malloc(sizeof(struct keyword));
keyword_dic_head->next = NULL;
/*************************初始化词典****************************/
/************************加载动态链接库*************************/
typedef int (*preadforbiddic)(char *dicfilepath, ForbidWord forbid_dic_head);
typedef int (*preadkeyworddic)(char *dicfilepath, KeyWord keyword_dic_head);
typedef char *(*pentry)(char *document, int summary_size, ForbidWord forbid_dic_head, KeyWord keyword_dic_head);
HINSTANCE hdllSummary;
HINSTANCE hdllReaddic;
pentry entry;
preadforbiddic readforbid_dic;
preadkeyworddic readkeyword_dic;
hdllSummary = LoadLibrary("summary_e.dll");
hdllReaddic = LoadLibrary("readdic.dll");
entry = (pentry)GetProcAddress(hdllSummary,MAKEINTRESOURCE(1));
//加载方式2加载获取摘要函数
readforbid_dic = (preadforbiddic)GetProcAddress(hdllReaddic,MAKEINTRESOURCE(3));//加载方式2加载读入禁用词典函数
readkeyword_dic = (preadkeyworddic)GetProcAddress(hdllReaddic,MAKEINTRESOURCE(2));//加载方式2加载读入关键词典函数
/************************加载动态链接库*************************/
if (readforbid_dic(forbid_dic_path, forbid_dic_head) == -1)
{
AfxMessageBox("read forbid dic error!\n");
return;
}
if (readkeyword_dic(keyword_dic_path, keyword_dic_head) == -1)
{
AfxMessageBox("read keyword dic error!\n");
return;
}
printf("readdic ok!\n");
readfileExtended(document, "1.txt"); //获取1.txt全文内容
summary = entry(document, 512, forbid_dic_head, keyword_dic_head);//获取摘要
//Summary的使用方式
printf("\n%s\n", summary);
AfxMessageBox(summary);
printf("\nSuccessful!\n");
FreeLibrary(hdllSummary); //释放summary_e.dll
FreeLibrary(hdllReaddic); //释放readdic.dll
return;
CDialog::OnOK();
}
现在想在c#中调用这两个dll
我的c#代码为:
public class word
{
public long high;
public long low;
public float sig;
public word1 next;
}
public const int MAX_WORD_LEN_E_K = 20;
public class keyword
{
public char[] word = new char[MAX_WORD_LEN_E_K];
public int weight;
public keyword next;
}
public class forbidword
{
public char[] word = new char[MAX_WORD_LEN_E_K];
public forbidword next;
}
[DllImport("readdic.dll", EntryPoint = "read_forbid_dic")]
static extern int readforbiddic(string dicfilepath, forbidword forbid_dic_head);
[DllImport("readdic.dll", EntryPoint = "read_keyword_dic")]
static extern int readkeyworddic(string dicfilepath, keyword keyword_dic_head);
[DllImport("summary_e.dll", EntryPoint = "_english_entry_summary")]
static extern string entry(string document, int summary_size, forbidword forbid_dic_head, keyword keyword_dic_head);
string forbid_dic_path = "forbid_dic.txt";
string keyword_dic_path = "keyword_dic.txt";
string summary;
forbidword forbid_dic_head = new forbidword();
keyword keyword_dic_head = new keyword();
private void _Click(object sender, EventArgs e)
{
if (readforbiddic(forbid_dic_path, forbid_dic_head) == -1)
{
MessageBox.Show("read forbid dic error!");
return;
}
else
if (readkeyworddic(keyword_dic_path, keyword_dic_head) == -1)
{
MessageBox.Show("read keyword dic error!");
return;
}
else
{
StreamReader TxtReader = new StreamReader("1.txt", System.Text.Encoding.GetEncoding("gb2312"));
summary = entry(TxtReader.ReadToEnd(), 512, forbid_dic_head, keyword_dic_head);
MessageBox.Show(summary);
}
}
debug在红色代码处报错:
Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
release则弹出蓝色代码:
read forbid dic error!
dll时别人写的,我拿来用,里面具体的函数操作我就不知道了