C++函數定義﹕int SetWindowAction(ProMdlType mdlType,char* mdlName)
{
ProError status;
ProMdl *mdlArray;
    wchar_t **names;
int mdlCount;
int activeIndex = -1;
char* name; name = (char*)malloc(sizeof(char *));
status = ProSessionMdlList(mdlType,&mdlArray,&mdlCount); status = ProArrayAlloc(mdlCount, sizeof(wchar_t *),1,(ProArray*)&names);
for (int i = 0 ; i < mdlCount; i ++)
{
names[i] = (wchar_t *)calloc(PRO_NAME_SIZE, sizeof(wchar_t)); status = ProMdlNameGet(mdlArray[i],names[i]); ProWstringToString(name,names[i]); if ((*mdlName) == (*name))
{
activeIndex = i;
break;
}
}    ProMdl mdl;
int windowId;
if (activeIndex != -1)
{
 mdl = mdlArray[activeIndex];
 ProMdlDisplay(mdl);
 ProMdlWindowGet(mdl,&windowId);
 ProWindowActivate(windowId);
} ProArrayFree((ProArray *)&names); return status;
}C#定義如下﹕
        [DllImport("PWF2Operator.dll", EntryPoint = "SetWindowAction", ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
        public static extern int SetWindowAction(ProMdlType mdlType, string mdlName);     調用方法如下﹕
        public void SetMdlAction(ProMdlType mdlType, string mdlName)
        {
            SetWindowAction(mdlType, mdlName);
        }調用時有時發生"嘗試讀取或寫入受保護的記憶體。這通常表示其他記憶體已損毀"。
但更多的時候是在關閉C#程序時會發生"Windows已經觸發***.exe的中斷點。可能是因為堆積損毀﹐這也表示***.exe中有錯誤﹐或是其載入的任何DLL中有錯誤。"這是為什么呀?我的感覺好像是內存分配或是釋放上出了問題﹐但我一直只用C#﹐不懂C++﹐兄弟們幫幫我呀﹗

解决方案 »

  1.   

    dll 代码不全,具体原因不太清楚,考虑以下几点
    1、dll所要求的字符串编码,如果是ansi, 最好在c#dll函数申明里加
    DllImport( ...... , CharSet=CharSet.Ansi ) ,因为unicode字符是2个字节,而ansi字符是1个字节,如果把unicode传入需要ansi的dll,读写是会发生错误
    2、ProSessionMdlList(mdlType,&mdlArray,&mdlCount);
      ProArrayFree((ProArray *)&names);
    是什么函数,是否有跨线程或跨dll的调用??
      

  2.   

    另外考虑使该DLL成为非托管DLL这样C#才能任意调用其它语言的DLL
      

  3.   

    ProSessionMdlList(mdlType,&mdlArray,&mdlCount);
      ProArrayFree((ProArray *)&names);
    它是調用了ProE的Dll﹐你的意思是說問題就出在這里?
      

  4.   

    調用時有時發生"嘗試讀取或寫入受保護的記憶體。這通常表示其他記憶體已損毀"。
    =====================================================
    这个错误,在我说的第一种情况下会发生但更多的時候是在關閉C#程序時會發生"Windows已經觸發***.exe的中斷點。可能是因為堆積損毀﹐這也表示***.exe中有錯誤﹐或是其載入的任何DLL中有錯誤。"
    ====================================
    这个错误一般出现的第二种情况
    http://community.csdn.net/Expert/topic/5072/5072647.xml?temp=.8002436
      

  5.   

    这个问题我也遇到过,主要还是传入参数个数或类型不符引起的。一定要确认DLL的参数数量和类型,如果不是同有参数类型还需要上网查一下对应的参数类型。另外还要注意参数是否是按引用传递的。呵呵,差不多就这些吧。