问题描述
问题描述:工具vs2008需要写个桌面读卡器的activex控件,调用BC900MAPI.dll(BC900MAPI.dll调用了Pcomm.dll)。为了测试,我先写了个winform的demo,在xp系统中可以正常运行(因为win8一直提示初始化失败,就不在win8上测了),代码如下publicpartialclassForm1:Form{[DllImport("BC900MAPI.dll",EntryPoint="BC900_COMMCALL")]publicstaticexternlongBC900_COMMCALL(stringcomm,refulongSOFTVersion);[DllImport("BC900MAPI.dll")]staticexternlongCloseCommPort();[DllImport("BC900MAPI.dll")]staticexternlongBC900_QueryListID(reflongListID_address);intli_pos;stringls_comm;stringls_customerID;publicForm1(){InitializeComponent();}privatevoidbutton1_Click(objectsender,EventArgse){ulonglul_SOFTVersion_address=0;longlul_ListID_address=0;ls_comm="COM3";ls_customerID="C0F0000000";//this.textBox1.Text="lul_SOFTVersion_address=="+lul_SOFTVersion_address+";li_return=="+li_return;//CloseCommPort();try{BC900_COMMCALL(ls_comm,reflul_SOFTVersion_address);BC900_QueryListID(reflul_ListID_address);this.textBox1.Text=lul_ListID_address.ToString();}catch(Exceptionex){this.textBox1.Text=ex.Message;return;}}}既然测试在xp通过,那我就在xp上activex控件了,[Guid("67CDD409-61A4-4f47-82AA-D2B738E29019")]publicpartialclassReaderCard:UserControl,IObjectSafety{[DllImport("BC900MAPI.dll",EntryPoint="BC900_COMMCALL")]publicstaticexternlongBC900_COMMCALL(stringcomm,refulongSOFTVersion);[DllImport("BC900MAPI.dll")]staticexternlongCloseCommPort();[DllImport("BC900MAPI.dll")]staticexternlongBC900_QueryListID(reflongListID_address);publicintli_pos;publicstringls_comm="COM3";publicstringls_customerID;publicstringiskh;publicstringprekh;publiclongl_return;publicReaderCard(){InitializeComponent();}publicstringGetStr(){return"这是测试";}publicvoidreadCard(){longid_Address=0;ulongSOFTVersion=0;l_return=BC900_COMMCALL(ls_comm,refSOFTVersion);l_return=BC900_QueryListID(refid_Address);this.iskh_l=id_Address.ToString();}publicstringgetKH(){readCard();returnthis.iskh;}后面的是IObjectSafety的实现,没考出来然后再把它生成exe的文件setup.exe和SetupReader.msi,为了方便调,没弄成cab的然后简单写个html调用<headrunat="server"><title>无标题页</title><scripttype="text/javascript">functionpassValue(){document.getElementById("textValue").value=document.getElementById("hello").GetStr();}functionpassValueA(){document.getElementById("textValueA").value=document.getElementById("hello").getKH();}</script></head><body><objectclassid="clsid:67CDD409-61A4-4f47-82AA-D2B738E29019"codebase="setup.exe"width="200"height="40"id="hello"></object><formid="form1"runat="server"><div><inputid="textValue"type="text"/><inputid="Button1"type="button"value="GetStr"onclick="passValue()"/><inputid="textValueA"type="text"/><inputid="Button2"type="button"value="getR"onclick="passValueA()"/></div></form></body></html>点第一个按钮正常的,点第二个按钮,调用dll的,就提示内存分配访问无效了求帮助哇。。。
解决方案
解决方案二:
解决方案三:
我还试了别的dll,也是这么写,可以调用成功的,求救
解决方案四:
求救求救求救求救求救求救求救求救求救求救