C#调用C++dll文件的问题,着急,请各位高手帮忙!

zzwwb1 2009-10-14 09:12:29
我调用两个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时别人写的,我拿来用,里面具体的函数操作我就不知道了


...全文
95 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzwwb1 2009-10-16
  • 打赏
  • 举报
回复
需要帮忙
zzwwb1 2009-10-14
  • 打赏
  • 举报
回复
各位高手伸出援助之手帮帮忙啊
zzwwb1 2009-10-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 herojams 的回复:]
这个稍微改一下
struct forbidword
{
char[] word;
forbidword next;
}
forbidword f;
f.word = new char[MAX_WORD_LEN_E_K]
[/Quote]

forbidword f
forbidword next都报错
_see_you_again_ 2009-10-14
  • 打赏
  • 举报
回复
这个稍微改一下
struct forbidword
{
char[] word;
forbidword next;
}
forbidword f;
f.word = new char[MAX_WORD_LEN_E_K]
zzwwb1 2009-10-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 herojams 的回复:]
forbidword是一个结构不是一个类

struct forbidword
{
char[] word = new char[MAX_WORD_LEN_E_K];
public forbidword next;
}
[/Quote]

不行啊,行不通。红色报错:cannot have instance filed initializers in structs
_see_you_again_ 2009-10-14
  • 打赏
  • 举报
回复
forbidword是一个结构不是一个类

struct forbidword
{
char[] word = new char[MAX_WORD_LEN_E_K];
public forbidword next;
}

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧