求助 !! 用C#调用一个地图控件(我估计是用C++ Builder写的)中的函数,出现“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”的异常。
用C#调用一个地图控件(我估计是用C++ Builder写的)中的函数,出现“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”的异常。求助!!!!
相关的说明
******************************************************************
地图控件提供的一个函数:
bool ReadLhtDefault(
LPUNKNOWN* MapDir,
LPUNKNOWN* CodeDir,
long MapScale,
double CenterB,
double CenterL,
bool IfAllArea,
double minB,
double minL,
double maxB,
double maxL
)
功能:调用矢量图,若调图成功,则返回true,否则为false。
参数:
MapDir:地图所在路径。
CodeDir:地图符号所在路径。
MapScale:地图比例尺。 CenterB:地图中心纬度坐标。
CenterL:地图中心经度坐标。 IfAllArea:若为true,则是全国漫游。后面四个参数可以不设,否则为区域漫游,改变必须设置后面的四个参数。
minB:地图区域的最小纬度值。 minL:地图区域的最小经度值。
maxB:地图区域的最大纬度值。 maxL:地图区域的最大经度值。
************************************************************
别人提供的用C++Builder写的调用该控件中对应函数的程序,函数正常工作,该程序中与调用该函数的相关内容如下:
#pragma link "GMAPINFOSVRLib_OCX" //地图控件
TGMapInfoSvr *GMapInfoSvr1;
AnsiString GlobalDir;
void __fastcall GetDirectory()
{
char pathname[300];
GetModuleFileName(NULL,pathname,298);
Get_FilePath(pathname);
Get_FilePath(pathname);
GlobalDir = AnsiString(pathname);
}
void __fastcall Get_FilePath(char *filename)
{
int i,len;
len = strlen(filename);
for(i=len-1;i>=0;i--)
{
if(filename[i]=='\\')
{
filename[i] = '\0';
break;
}
}
}
bool __fastcall TForm1::ReadMap()
{
FILE *fp;
char S_Name[256];
double CenterB,CenterL;
char PixleMapDirectory[300];
char MapName[500];
bool flag;
char lsStr[100];
sprintf(S_Name,"%s\\data\\yhdata\\zytj\\%s.dat",GlobalDir.c_str(),
ListBox1->Items->Strings[ListBox1->ItemIndex].c_str());
if(!FileExists(S_Name))
return false;
fp = fopen(S_Name, "rb");
if(fp==NULL)
return false;
fread(&mapType, sizeof(int), 1, fp);
fread(&Scale, sizeof(int), 1, fp);
fread(&Range, sizeof(int), 1, fp);
fread(&minL, sizeof(double), 1, fp);
fread(&minB, sizeof(double), 1, fp);
fread(&maxL, sizeof(double), 1, fp);
fread(&maxB, sizeof(double), 1, fp);
fread(&CenterL, sizeof(double), 1, fp);
fread(&CenterB, sizeof(double), 1, fp);
fread(smName, sizeof(char), 200, fp);
fclose(fp);
switch(mapType)
{
case 0://矢量
strcpy(PixleMapDirectory,GlobalDir.c_str());
strcat(PixleMapDirectory,"\\data");
strcpy(MapName,GlobalDir.c_str());
strcat(MapName,"\\data");
if(Range==1)
flag = GMapInfoSvr1->ReadLhtDefault((LPUNKNOWN*)PixleMapDirectory,(LPUNKNOWN*)MapName,
Scale,CenterB,CenterL,true,0,0,0,0);
else
flag = GMapInfoSvr1->ReadLhtDefault((LPUNKNOWN*)PixleMapDirectory,(LPUNKNOWN*)MapName,
Scale,CenterB,CenterL,false,minB,minL,maxB,maxL);
break;
.........
}
}
******************************************
我用C#写的相关部分
public virtual bool ReadLhtDefault(ref object mapDir, ref object codeDir, int mapScale, double centerB, double centerL, bool ifAllArea, double minB, double minL, double maxB, double maxL) //这是引用地图控件后VS.NET自动添加的引用中的函数声明。
string s1 = @"C:\Program Files\XdXT\data" + '\0'; //就是地图所在路径,同时也是地图符号所在的路径
string s2 = @"C:\Program Files\XdXT\data" + '\0'; //就是地图所在路径,同时也是地图符号所在的路径
object oTm1 = (object)s1;
object oTm2 = (object)s2;
bool ret = this.axGMapInfoSvr1.ReadLhtDefault(ref oTm1 , ref oTm2, iMapScale, dCenterL, dCenterB, true, 0, 0, 0, 0); //iMapScale等后面的参数都没有问题
运行后就会出现“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”的异常。
我将S1,S2通过Encoding对象转化为UTF-8,UTF-16,ASCII类型(都试过)的byte[]数组,在数组后面加上'\0'NULL字符运行后还是一样,
我用非托管函数也试过(就是不怎么会用)也不行。
我现在都不知道朝哪个方向去尝试,哪位高人兄能帮我一把?,十分十分感谢!!!! --------------------编程问答-------------------- 不太好看:)
可能它要你给他申请一段buffer
C#中实现虚拟地球(地图浏览器)
ivanx 著于2007-8-16 8:07:09
本文的目的是想在Windows Form中加载虚拟地球的地图。因为,你可以轻易地在HTML页面上加载这些地图,所以我会使用WebBrowser 控件。但是如何在WinForm上控制... --------------------编程问答-------------------- 各位兄弟姐妹,谁能帮我? --------------------编程问答-------------------- 自己顶起来
--------------------编程问答-------------------- 愈发觉得自己跟没学过似的无知····
补充:.NET技术 , C#