0

I use VC wrote a function in DLL:

extern "C" __declspec(dllexport) HRESULT  GetDiskType(INT64* nTypeRet, LPWSTR szDisk)
{
    USES_CONVERSION;
    CString strDisk = CW2CT(szDisk);

    *nTypeRet = GetDriveType(strDisk);

    return TRUE;
}

I inovke it in inno-setup:

procedure InitializeWizard();
var nDrType:any;

begin
    GetDiskType(nDrType, 'D:\\');
    //MsgBox(IntToStr(nDrType), mbInformation, MB_OK);
    if (nDrType=3) or (nDrType=6) then
    begin        
      WizardForm.DirEdit.Text := 'D:\\{#MyAppPublisher}\{#MyAppName}';   
    end;    
end;

when running, it show errors:write of address 00000000

  • function GetDiskType(pKeyRet:integer; pszDirName: String) : integer; external 'GetDiskType@files:AppRegDll.dll cdecl setuponly'; – jackey chen Jul 14 '21 at 06:14

1 Answers1

0

I found the answer 1, change the function declare in dll:

//extern "C" __declspec(dllexport) HRESULT  GetDiskType(INT64* nTypeRet, LPWSTR szDisk)
extern "C" __declspec(dllexport) HRESULT  GetDiskType(int* nTypeRet, LPWSTR szDisk)

2, declare the function in inno-setup use keyword var:

function GetDiskType(var pKeyRet:integer; pszDirName: String) : integer; external 'GetDiskType@files:AppRegDll.dll cdecl setuponly'; 

thanks to Martin Prikryl for help!