小弟我是个菜鸟,现在公司里面的管理程序要和外部一个硬件做通讯。
对方给了一个C++写的DLL,我这边调用的时候老是报一个写内存地址的错误,具体错误如下:
access violation at 0x7c94a719 write of address 0x00040d28。
我静态调用DLL的方法:
function Connect(const sPort: WideString; iTimeouts: integer): integer; stdcall; external '.\lib\Skq100ACtl.dll' name 'Connect';
对方给我的接口的说明:
命令名称:Connect
参数:port(BSTR)
      Timeouts(LONG)   
返回值:State(LONG)
    小弟知道这里问问题是要给分的,但小弟新注册的账号也没什么分数,希望各位大虾给点意见。万分焦急。

解决方案 »

  1.   


    对方给的答复是std的,我也用cdecl的试过,还是报同样的错误。
      

  2.   

    俺也遇到过,,
    1.查看调用规则,是否相同
    2.使用基本类型,不要使用string等类型,使用指针pchar
    所以,5楼正解!
      

  3.   

    如果确认原型是宽字符,那就改WideString为PWideChar试试
      

  4.   


    能具体给段代码么? 
    我在测试的时候使用以下代码,出现同样的错误。
    var
        sPchar: PChar;
        sPchar1: array[0..32] of char;     
    begin
        sPchar := PChar(@sPchar1);
        ZeroMemory(sPchar, 32); 
        Unit2.Connect(sPchar, 30);
    end;其中Unit2中的 Connect 是静态调用的,代码如下:
    function Connect(sPort: pchar; iTimeouts: integer): integer; stdcall; external '.\lib\Skq100ACtl.dll' Name 'Connect';
      

  5.   

    回复楼上,我试过他们说的那几种方法,都还是同样的错误,但对方公司使用.net做了一个小程序是可以跑起来的。
    我现在用了动态调用的方法,发现引用这个dll是成功的,但GetProcAddress 获取Connect函数地址的时候,返回地址是nil,不知道这个和传入的参数有没关系?
    TConnect = function(sPort: WideString; iTimeouts: integer): integer; Stdcall;
         DllForm := LoadLibrary('.\lib\Skq100ACtl.dll');
        if DllForm <> 0 then //可以认为是调用到了dll?
        begin
            @Connect := GetProcAddress(DllForm, 'Connect');        if not (@Connect = nil) then //如果=nil 是否可以认为没有这个Connect函数?
            begin
                Connect('com1', 30);
            end;
        end;
      

  6.   

    厂家的动态库,不会是用dotnet开发的吧?
    那你就郁闷了。
    你问问,这是重要的问题。
    如果是dotnet开发的,那你就有的找了,
    好像除了dotnet别的语言调用不成功。
      

  7.   

    回复楼上,说是C++ 开发的,我不知道是不是.net平台的。
    现在又发现一个问题,对方提供的dll中集成了多个函数的,我找了个不需要传参数的,同样调用不到。
    @GetCurrentInvInfo:= GetProcAddress(DllForm, GetCurrentInvInfo) 后
    @GetCurrentInvInfo的结果一样是nil。
    所以是不是可以认为不是我传入的参数的问题?
    唉,郁闷了。