当前位置:编程学习 > C#/ASP.NET >>

求助 !! 用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#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,