我用delphi调用一个VC++的dll
这个dll里面的一个ClsPort函数,dll说明说里面有,说明如下:5、ClsPort
VOID PASCAL ClsPort(HANDLE hCom)
功能说明:关闭指定的通信端口。
参数说明:
返回值:无
相关函数:我用eeXeScope查看也有这个函数
但是我动态,静态调用dll都会报内存错误
动态调用
FunClsPort := GetProcAddress(FHandle,'ClsPort')
if Assigned(FunClsPort) thenAssigned(FunClsPort)返回为false
并未加载到此函数。这是为什么呢?最多只能给100分,请专家指教啊。。
这个dll里面的一个ClsPort函数,dll说明说里面有,说明如下:5、ClsPort
VOID PASCAL ClsPort(HANDLE hCom)
功能说明:关闭指定的通信端口。
参数说明:
返回值:无
相关函数:我用eeXeScope查看也有这个函数
但是我动态,静态调用dll都会报内存错误
动态调用
FunClsPort := GetProcAddress(FHandle,'ClsPort')
if Assigned(FunClsPort) thenAssigned(FunClsPort)返回为false
并未加载到此函数。这是为什么呢?最多只能给100分,请专家指教啊。。
就是Close的这个函数找不到。这是为什么?谁帮我解决再开贴给100分。救命啦。。
TFun2=function(hCom: Thandle): Variant ; stdcall;
TFun3=function(DevNo: LPCSTR;var pAbout: LPSTR): DWORD ; stdcall;Var FHandle: THandle;
Fun1: TFun1;
Fun2: TFun3;
Fun3: TFun2;
DevNo: LPCSTR;
pAbout: LPSTR;
begin
FHandle := LoadLibrary('168netcom.dll');
try
if FHandle>0 then
begin
Fun1 := GetProcAddress(FHandle,'OpenCommPort');
if Assigned(Fun1) then
begin
if Fun1('COM1',9600)=1 then
begin
Fun2 := GetProcAddress(FHandle,'ReadDevAbout');
if Assigned(Fun2) then
begin
Fun2('0014',pAbout);
ShowMessage(LPSTR(@pAbout));
end;
end;
Fun3 := GetProcAddress(FHandle,Pchar('CloseCommPort'));
if Assigned(Fun3) then
begin
Fun3(0);
ShowMessage('OK');
end;
end;
end;
finally
try
FreeLibrary(FHandle);
except
end;
end;
end;
大小写是没有问题的。我复制过来的。
前面全都可以,调试绝对,ShowMessage(LPSTR(@pAbout));完全正常。
Fun3 := GetProcAddress(FHandle,Pchar('CloseCommPort'));
if Assigned(Fun3) then
begin
Fun3(0);
ShowMessage('OK');
end;
就是这里不能进入
Fun3(0);
ShowMessage('OK');
Fun3 := GetProcAddress(FHandle,Pchar('CloseCommPort'));
这个地方我用过
TFun2=procedure(hCom: Thandle); stdcall;
也没有用。
主要是
Fun3 := GetProcAddress(FHandle,Pchar('CloseCommPort'));
这里都没有通过。
这个地方我也过这样的。
Fun3 := GetProcAddress(FHandle,'CloseCommPort');都没有用啊
TFun2=function(hCom: Thandle): Variant ; stdcall;
TFun3=function(DevNo: LPCSTR;var pAbout: LPSTR): DWORD ; stdcall; 改为 TFun1=function(lpszPortNum: LPCSTR;dwBaudRate: DWORD): DWORD; stdcall;
TFun3=procedure(hCom: Thandle); stdcall;
TFun2=function(DevNo: LPCSTR;var pAbout: LPSTR): DWORD ; stdcall; 试试
VOID PASCAL ClsPort(HANDLE hCom)
功能说明:关闭指定的通信端口。
参数说明:
返回值:无
相关函数: ----------------------
无返回值,你别用function ,用procedure
你没声明对,你把VC代码函数头贴出来
27 exported name(s), 28 export addresse(s). Ordinal base is 1.
Sorted by Name:
RVA Ord. Hint Name
-------- ---- ---- ----
000025E0 15 0000 AddList
000041A0 24 0001 AutoBIG5ToGB
00003830 20 0002 ClearAlarm
00002990 17 0003 ClearList
000014A0 2 0004 CloseCommPort
00002A50 16 0005 DelList
000038E0 21 0006 DevReset
000012E0 1 0007 OpenCommPort
00003730 19 0008 OpenDoor
00002B70 13 0009 ReadAllRecord
00002450 8 000A ReadCardSN
00001E70 3 000B ReadDevAbout
00003690 11 000C ReadDevSN
00002D00 14 000D ReadRecord
00003470 9 000E ReadSetting
00002240 4 000F ReadState
00001F10 5 0010 ReadTime
00004180 25 0011 SetAutoBIG5ToGB
00002140 28 0012 SetDevSN
000014F0 27 0013 SetNetPWD
00003F10 26 0014 SetOEMTitle
00003990 23 0015 SetShowMessage
00003CA0 22 0016 SetShowTitle
00002510 18 0017 StopOpCard
00002300 7 0018 WarrantSystem
00002FB0 10 0019 WriteSetting
00001FD0 6 001A WriteTime
那种在DELPHI里好象不能调用的
非常感谢。不是很明白MFC拓展DLL
但是我调用其他函数都可以啊。只有CloseCommPort找不到。
我没有dll的源码。我只有一个dll
VOID PASCAL CloseCommPort(HANDLE hCom)
功能说明:关闭指定的通信端口。
参数说明:
返回值:无
相关函数: 根据上述声明,本人认为你的声明应该改为:
TFun2=procedure(hCom: Thandle); pascal;请注意原来的声明是:VOID PASCAL CloseCommPort(HANDLE hCom)
是PASCAL约定方式调用,而不是STDCALL方式。
非常感谢。我改成这样了。
问题是这句为什么会返回为nil呢?
Fun3 := GetProcAddress(FHandle,'CloseCommPort');
难道PASCAL约定调用的问题?
有错误信息吗