IsActivated return true even after calling Deactivate

I have some logic in my app around calling IsGenuine, which goes something like this (as has been suggested):

Call IsGenuine after 90 days.Give the user a few chances for IsGenuine to fail.If it still fails after that, Deactivate.

The problem is, if IsGenuine fails because the user doesn't have an internet connection, then Deactivate will also fail. And if Deactivate failed, IsActivated still returns TA_OK.

Is this the expected behavior?

I'm not really sure what to do at this point to prevent the user from running the app again.

Call IsGenuine after 90 days.Give the user a few chances for IsGenuine to fail.If it still fails after that, Deactivate.

Intead of calling Deactivate() after failing the IsGenuine() call for 90 consecutive days, your app should just block the user from continuing using your app unless they connect to the internet. Does that make sense?

We're going to have to add a function to make this all easier. RIght now we think we've made this too complicated.

Is this the expected behavior?

Yes. Because Deactivate() will only succeed if it can actually talk to the LimeLM servers.

Ok, but it seems that in order to "block the user from continuing", the only thing I can do is call IsGenuine every time the app runs, which I don't want to do, right? None of the other function calls return errors, so I can't use them.

Otherwise, the only thing I can do is, after IsGenuine fails like 5 times, store that failure as an encrypted variable in a file or in the registry or something, and read that variable every time when that app starts. Would that be your suggestion?

Sorry, typo, I meant "...read that variable every time when THE app starts..."

Ok, but it seems that in order to "block the user from continuing", the only thing I can do is call IsGenuine every time the app runs, which I don't want to do, right?

You're right, in that you don't want to call IsGenuine() every time your app runs. However, that's not the only way to block the user from continuing with your app.

Otherwise, the only thing I can do is, after IsGenuine fails like 5 times, store that failure as an encrypted variable in a file or in the registry or something, and read that variable every time when that app starts. Would that be your suggestion?

Yes, that's the only way to do it now. In TurboActivate 3.3 we're going to make this easier, because we realize that as it is now we require our customers to write too much "boilerplate" code. We're going to add another function where TurboActivate handles all the details and keeping track of dates for you.

That sounds great. Looking forward to it.

Yes, that's the only way to do it now. In TurboActivate 3.3 we're going to make this easier, because we realize that as it is now we require our customers to write too much "boilerplate" code. We're going to add another function where TurboActivate handles all the details and keeping track of dates for you.

That is true, but I would like the suggest to allow TurboActivate to keep track of other value types too (at least strings) or to tag the dates (maybe I want to keep track of different dates and counters and I must be able to distinguish between them).

... but I would like the suggest to allow TurboActivate to keep track of other value types too ...

I'm not quite sure what you mean. Can you give me an example of what you're trying to accomplish?