Pregunta

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.

¿Fue útil?

Solución

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top