现在的问题是一调用的时候就出现了
Access violation at address 003c2841 in module 'DllCON.dll',Read of address 00000038.
这样的错误。其中DLLCON.DLL是我编写的。请问一般要怎么解决阿。
Access violation at address 003c2841 in module 'DllCON.dll',Read of address 00000038.
这样的错误。其中DLLCON.DLL是我编写的。请问一般要怎么解决阿。
要怎么改,,大哥们
只要挂关系到参数的都用PChar
一定
你看看新建一个DLL Wizard时系统给出的提示就知道了。
不过还是建议用PChar而不用ShareMem
1 dll中输出的函数加上stdcall
2 声明时加上stdcall================================================================CSDN 论坛助手 Ver 1.0 B0402提供下载。 改进了很多,功能完备!★ 浏览帖子速度极快![建议系统使用ie5.5以上]。 ★ 多种帖子实现界面。
★ 保存帖子到本地[html格式]★ 监视您关注帖子的回复更新。
★ 可以直接发贴、回复帖子★ 采用XML接口,可以一次性显示4页帖子,同时支持自定义每次显示帖子数量。可以浏览历史记录!
★ 支持在线检测程序升级情况,可及时获得程序更新的信息。★★ 签名 ●
可以在您的每个帖子的后面自动加上一个自己设计的签名哟。Http://www.ChinaOK.net/csdn/csdn.zip
Http://www.ChinaOK.net/csdn/csdn.rar
Http://www.ChinaOK.net/csdn/csdn.exe [自解压]
是不是我这样改阿。
以前定义的string类型全部改为pchar就可以了阿
如果函数要输出,声明处最好写上export
你们有碰到过这样的问题吗??
================================================================CSDN 论坛助手 Ver 1.0 B0402提供下载。 改进了很多,功能完备!★ 浏览帖子速度极快![建议系统使用ie5.5以上]。 ★ 多种帖子实现界面。
★ 保存帖子到本地[html格式]★ 监视您关注帖子的回复更新。
★ 可以直接发贴、回复帖子★ 采用XML接口,可以一次性显示4页帖子,同时支持自定义每次显示帖子数量。可以浏览历史记录!
★ 支持在线检测程序升级情况,可及时获得程序更新的信息。★★ 签名 ●
可以在您的每个帖子的后面自动加上一个自己设计的签名哟。Http://www.ChinaOK.net/csdn/csdn.zip
Http://www.ChinaOK.net/csdn/csdn.rar
Http://www.ChinaOK.net/csdn/csdn.exe [自解压]
我以前刚开始的时候就遇到了这个问题
在DLL中一定使用PChar这种类型
如果你用PChar作为函数返回类型,请先使用GetMem分配内存
比如
GetMem(Result, 255);
如果你用VB调用这种函数
使用之前也一定要分配一下String的长度
比如
Dim Ret as String
Ret = String(255, VbNull)
uses ShareMem 要写在第一个
我最近也被DLL返回值的问题搞得焦头烂额,有谁能顺便解决我这个问题,我也奉上100分.(请不要告诉我使用ShareMem,我只想知道我这样写有什么问题)
例如:
在DLL中:
//*其中省略了 DLL Form创建和销毁的函数,我认为是没有问题的
......
Function Get_Change:PChar; stdcall;
var tmp:string;
begin
tmp:=inttostr(Calendar1.Year)+#13#10+
inttostr(Calendar1.Month)+#13#10+
inttostr(Calendar1.Day);
Result:=PChar(tmp);
end;而调用文件:
....
Type
TPlugInChanged = Function ():PChar; stdcall;
......
var
Parent_Handle:THandle;
......procedure TForm1.Button1Click(Sender: TObject);
var Loader:TPlugInChanged;
begin
if Plugin_library=0 then
Plugin_library:=LoadLibrary(PChar(edit1.text));
if PLugin_Library = 0 then begin
ShowMessage('Can Not Load '+edit1.text); exit;
end;
try
@Loader:=GetProcaddress(PLugin_Library,'Get_Change'); if @Loader<>nil then memo1.Lines.Add(Loader)
else memo1.Lines.Add('--> InterFace Function Error');
except freelibrary(PLugin_Library); Plugin_library:=0;
memo1.Lines.Add('Free Library');
end;
end;
并且放在第一个。
还是有上面的错误。不过第一个号码变了一点,变成了002827D5 了,这样是进步了还是退步了阿。呵呵
先使用GetMem分配内存,不然肯定会出错的
能不那个给我举个例子??一小段代码就可以了
procedure Transmit;
var
i,count:integer;
commflg:boolean;
sbuf:array of byte;
begin
commflg:=true;
count:=Length(Send);
setLength(sbuf,count);
for i:=1 to count do
begin
sbuf[i]:=byte(Send[i]);
if not Form1.Comm1.WriteCommData(@sbuf[i],1) then
begin
commflg:=false;
break;
end;
sleep(2);
end;
if not commflg then
MessageDlg('发送失败!',mterror,[mbyes],0);
end;procedure ReadData;
var
buffer:Pointer;
BufferLength:Word;
begin
SetLength(Receive,BufferLength);
Move(Buffer^,Receive,BufferLength);
end;Function OpenCom(Comname:shortstring):BOOL;//打开串口
begin
Comm1.StartComm;
Comm1.CommName:=Comname;
end;Function CloseCom:BOOL;//关闭串口
begin
Comm1.StopComm;
end;Function SetNetID(BoardID:integer;Address:integer):BOOL;//设置门禁机网络逻辑地址号
begin
bagsize:=chr($04);
s0:=start;
s1:=start;
s2:=chr($4f);
s3:=chr(Address);
s4:=bagsize;
s5:=chr(BoardID);
Send:=s0+s1+s2+s3+s4+s5;
Transmit; ReadData;
Raddress:=r3;
r0:=copy(Receive,1,1);
r1:=copy(Receive,2,1);
r2:=copy(Receive,3,1);
r3:=copy(Receive,4,1);
bagnumber:=copy(Receive,5,2);
if r0+r1=start+start then
if r2=chr($5f) then
Result:=true
else if r2=chr($7f) then
Result:=false
end;
顺便问一下,怎么给分给别人,自己怎么赚分~~~~~~~~~~~~~~~~~~~~~~~~
我们约好一起去看雪!☆★○●◎◇◆□■△▲※