Question

Using the twaindotnet library in C#, I'm wondering if there's a way to set the default datasource using the library.

As a feeble attempt, I've tried adding a SetDefault method to the DataSource class of twaindonet, like this

    public static void SetDefault(Identity applicationId, IWindowsMessageHook messageHook, DataSource newDataSource)
    {
        var defaultSourceId = newDataSource.SourceId;

        // Attempt to get information about the system default source
        var result = Twain32Native.DsmIdentity(
            applicationId,
            IntPtr.Zero,
            DataGroup.Control,
            DataArgumentType.Identity,
            Message.Set,
            defaultSourceId);

        if (result != TwainResult.Success)
        {
            var status = DataSourceManager.GetConditionCode(applicationId, null);
            throw new TwainException("Error getting information about the default source: " + result, result, status);
        }
    }

which is called from the DataSourceManage class like this

    public void SelectSource(DataSource dataSource)
    {
        DataSource.Dispose();
        DataSource.SetDefault(ApplicationId, _messageHook, dataSource);
    }

But when I try to use SetDefault, Twain32Native.DsmIdentity always results in Failure being returned.

I basically copied from SetDefault the setDefaultDataSource method from TWAIN sample Data Source and Application

pTW_IDENTITY TwainApp::setDefaultDataSource(unsigned int _index)
{
if(m_DSMState < 3)
{
    cout << "You need to open the DSM first." << endl;
    return NULL;
}

else if(m_DSMState > 3)
{
    PrintCMDMessage("A source has already been opened, please close it first\n");
    return NULL;
}

if(_index >= 0 && _index < m_DataSources.size())
{
    m_pDataSource = &(m_DataSources[_index]);

    // set the specific data source
    TW_UINT16 twrc;
    twrc = _DSM_Entry(
        &m_MyInfo,
        0,
        DG_CONTROL,
        DAT_IDENTITY,
        MSG_SET,
        (TW_MEMREF) m_pDataSource);

    switch (twrc)
    {
    case TWRC_SUCCESS:
        break;

    case TWRC_FAILURE:
        printError(0, "Failed to get the data source info!");
        break;
    }
}
else
{
    return NULL;
}

return m_pDataSource;
}

Any help would be greatly appreciated.

Était-ce utile?

La solution

The possible cause is that the version of your TWAIN DSM is too low. Only DSM 2.0 or above supports setting default TWAIN data source.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top