Да, как-то не оптимально получается писать функцию в unmanaged для того только чтобы из неё вызвать другую функцию.
Но не знаю закрывать тему или нет, потому что я сдлал по совету Maslov а компоновщик начал ругаться уже подругому:
Код:
В ассемблере:
global _myFunc@4
В С++ :
using namespace System;
extern "C" myStruct * __stdcall myFunc(int) ;
#pragma managed(push, off)
myStruct * intermediateFunc(int a)
{ return myFunc(a) ; }
#pragma managed(pop)
............................................
Ошибка 3 error LNK2028: ссылка на неразрешенную лексему (0A0004AF) "void __stdcall _com_issue_error(long)" (?_com_issue_error@@$$FYGXJ@Z) в функции "void __cdecl _com_util::CheckError(long)" (?CheckError@_com_util@@$$FYAXJ@Z) Memory Damp.obj Memory Damp
Ошибка 4 error LNK2019: ссылка на неразрешенный внешний символ "void __stdcall _com_issue_error(long)" (?_com_issue_error@@$$FYGXJ@Z) в функции "void __cdecl _com_util::CheckError(long)" (?CheckError@_com_util@@$$FYAXJ@Z) Memory Damp.obj Memory Damp
Ошибка 5 fatal error LNK1120: 2 неразрешенных внешних элементов D:\NASM\МОИ ПРОГРАММЫ\Visual Studio 2008\Projects\Memory Damp\Debug\Memory Damp.exe Memory Damp
Похоже что с ассемблерной функцией теперь всё в порядке, но теперь проблема с какой-то функцией CheckError. Это не моя функция - я её нигде не писал и не использовал.
______________________________________
Ошибка средств компоновщика LNK2028:
Сообщение об ошибке
"exported_function" (decorated_name) в функции "function_containing_function_call" (decorated_name)
"exported_function" (decorated_name) referenced in function "function_containing_function_call" (decorated_name)
При попытке импортирования внутренней функции в чистый образ следует помнить о том, что явный вызов соглашений отличается во внутренней и чистой компиляции.
Пример
В примере этого кода создается компонент с экспортированной и внутренней функцией, явно вызывающий соглашение __cdecl.
Код:
// LNK2028.cpp
// compile with: /LD
__declspec(dllexport) int func() {
return 3;
}
В следующем примере создается чистый клиент, использующий внутреннюю функцию. Однако вызов соглашения в /clr:pure представляет из себя __clrcall. Следующий пример приводит к возникновению ошибки LNK2028.
Код:
// LNK2028_b.cpp
// compile with: /clr:pure lnk2028.lib
// LNK2028 expected
int func();
int main() {
return func();
}
Ошибка средств компоновщика LNK2019:
Сообщение об ошибке
ссылка на неразрешенный внешний символ "символ" в функции "функция".
unresolved external symbol 'symbol' referenced in function 'function'.
Обнаружен неопределенный внешний символ (symbol) в function. Чтобы устранить эту ошибку, предоставьте определение для символа или удалите код, который на него ссылается. Дополнительные сведения см. в следующих разделах:
...
-- Ср ноя 04, 2009 20:18:41 --Нашёл ! Тут:
http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/a87f6d96-4850-4bdf-bfcf-9827371e1bd2This seems to be a calling convention problem, since _com_issue_error explicity use __stdcall calling convention, but when you use /clr switch, all functions are compiled as managed by default, so I suggest you to add #pgrama directive to switch off managed compilation against the function where _com_util::CheckError is called, try add following code:
Code Snippet
Код:
#pragma managed(push,off)
//the function body where you call _com_util::CheckError
#pragma managed(pop)
I am sure you forget to add comsupp.lib to your project's additional dependencies, try add following code to places that before you use _com_util:
Code Snippet
Код:
#pragma comment(lib,"comsupp.lib")
Я так и сделал:
Код:
using namespace System;
extern "C" myStruct * __stdcall myFunc(int) ;
#pragma managed(push, off)
#pragma comment(lib,"comsupp.lib")
myStruct * intermediateFunc(int a)
{ return myFunc(a) ; }
#pragma managed(pop)
Проект построился. Но...