duxburydutch Ответов: 2

Почему это утверждение несостоятельно?


Похоже на очень простую задачу:

VS2017 15.9.13 (последняя версия на сегодня)

Моя основная программа, а затем DLL:

#include <windows.h>
#include <stdio.h>
#include <time.h>

extern "C" int WINAPI wWinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow )
{
	time_t now = time ( 0 );
	FILE *log = _wfopen ( L"test.dat", L"wt,ccs = UNICODE" );

	if ( HMODULE hdll = LoadLibrary ( L"Dll1" ) )
	{
		typedef int ( _cdecl *typeCreate )(int, FILE *);
		typeCreate Create = ( typeCreate ) GetProcAddress ( hdll, "MySub" );
		if ( Create )
		{
			fwprintf ( log, L"Test 2 at %s", _wctime ( &now ) ); fflush ( log );
			int nn = ftell ( log );
			int n = 21;
			nn = Create ( n, log );
		}
	}
    fclose (f);
	return EXIT_SUCCESS;
}

#include <stdio.h>
extern "C" __declspec (dllexport)  int MySub ( int n, FILE *f )
{
	int nn = 0;
	if ( f )
	{
		nn = ftell ( f );
		fwprintf ( f, L"Number %d\n", n );
		fflush ( f );
		nn = ftell ( f );
	}
	return nn;
}


Запуск этой программы после изменения и сброса некоторых параметров проекта завершается неудачей с:

Отладочное утверждение не удалось!
Program: C:\xxxxxx\Dll1\Debug\Project1.exe
File: minkernel\crts\ucrt\src\appcrt\lowio\lseek.cpp
Line: 103

Expression: _osfile(fh) & FOPEN

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

(Press Retry to debug the application)


Что я уже пробовал:

Когда этот проект только что создан, он работает так, как и ожидалось. После внесения (и возврата) некоторых настроек проекта, таких как указание Windows 8.1 в качестве версии Windows SDK, программа продолжает терпеть неудачу в операторе ftell в DLL, независимо от того, что я пытаюсь сделать.

У меня есть полный проект, Доступный в виде zip-файла, но я не вижу способа загрузить этот файл.

Надеюсь на хорошее предложение,

Хенк Б

2 Ответов

Рейтинг:
1

duxburydutch

Проблема заключалась в настройках проекта, в частности в библиотеке времени выполнения. Для DLL это была многопоточная отладочная библиотека dll (/MDd), в то время как для основной программы это была многопоточная отладка (/MTd). После установки обоих проектов в /MDd все снова хорошо.

Хенк Б


Рейтинг:
0

KarstenK

Я думаю, что это происходит из-за какой-то проблемы раньше, поэтому мне не нравится, что вы не используете полные пути. Это может быть причиной вашей проблемы. Другими причинами могут быть проблемы с правами или уже используемые ручки.

АП вам лучше проверить коды возврата для коды успеха из ранее вызванных функций. Вы можете получить -1 и двинулся дальше.


duxburydutch

Спасибо за ваш ответ. Я заметил, что проблема не существует, когда все скомпилировано как X64. Но когда я переключаюсь обратно на Win32 (x86), проблема появляется снова.
Извините, что скрываю полный путь, но я не понимаю, почему это может замаскировать или изменить проблему. Нет никаких проблем с правами, потому что fwprintf и ftell в основной программе работают правильно.
Хенк Б