|
Thanks for your reply:
Well that was about where I was aiming at.
I never heard of the "#import" directive before so I will have to look into that. I have not too much experience with Visual studio.
Perhaps I should explain a little more about the situation.
Currently I have a ".lib" and a ".dll" generated by Compaq Visual Fortran.
I've declared the function called from the .dll as follows:
<br />
extern "C" void __declspec(dllimport) extiteratie( [arguments] )<br />
First I get the warning:
<br />
TFortranInterface.cpp(27) : warning C4272: 'extiteratie' : is marked __declspec(dllimport); must specify native calling convention when importing a function.<br />
after that an error
<br />
error LNK2031: unable to generate p/invoke for "extern "C" void __clrcall extiteratie( float*, float*, (...) float* )" (?extiteratie@@$$J0YMXPAM000000000000000PAH110@Z); calling convention missing in metadata<br />
(After this an unresolved token error which is most likely caused by the previous error.)
I am currently using a native class as interface because I need to pass the function in the .dll a set of pointers which will be filled with results.
The questions:
1. With /clr:pure I cannot use that native class?
2. Any idea what the error could mean (and/or perhaps an alternate declaration for the function in the .dll?)
(3. what does #import do?)
best regards,
Jan Timmerman
|
|
|
|
|
1. With /clr:pure I cannot use that native class?
Yes, You can use native class in a /clr:pure c++/cli project.
2. Any idea what the error could mean (and/or perhaps an alternate declaration for the function in the .dll?)
Note the warning you got: "warning C4272: 'extiteratie' : is marked __declspec(dllimport); must specify native calling convention when importing a function."
Your function declaration was:
extern "C" void __declspec(dllimport) extiteratie( [arguments] ) : Here you havn't mentioned any calling convention. So compiler took the clr only calling convention __clrcall . Now see the error message you got - "error LNK2031: unable to generate p/invoke for "extern "C" void __clrcall extiteratie( float*, float*, (...) float* )" (?extiteratie@@$$J0YMXPAM000000000000000PAH110@Z); calling convention missing in metadata"
This means that C++/CLI compiler is not able to generate the p/invoke for a function which is reserverd for CLI only (because of the by default __clrcall calling convention).
So to fix this, change the function declaration as below:
extern "C" void __stdcall __declspec(dllimport) extiteratie( [arguments] )
Here if the calling convention of extiteratie is soemthing else other than __stdcall , then put the same instaed.
3. what does #import do?)
You dont have to worry abt #import as ur dll is not a com dll. It is for using com components.
Hope this will help...mil10.
|
|
|
|
|
Great, it works!
i've modified the function call to
<br />
extern "C" void __cdecl extiteratie( [arguments] )
(from the error messages I noticed the compiler ignores the "__declspec(dllimport)" part when including __cdecl)
Also I added an underscore to the function export in the Fortran code which was needed by __cdecl.
An alternative is (most likely but not tested) to use __stdcall in the export. I do not think it makes much difference whether I use __stdcall or __cdecl?
Thanks a lot!
Jan Timmerman
|
|
|
|
|
wud ne body b willing to explain to me how to create a madlib while adding in the fact that one must "flush" it?
J-Dub
|
|
|
|
|
I am using CFileDialog for a "save as" where I have to choices for file types: All Files or Avi Files.
I noticed something very strange and discovered it is DIRECTLY related to Managed C++.
First of all, the "save as" function is done correctly, so 99% of the problem is solved.
It comes up with All Files and indeed shows all files. The problem comes when I change to show only avi files. The window goes blank. If I go back to all files, it stays blank. Only if I choose a different folder is it refreshed properly (with either all or avi files).
I tried it in Paint and there if you change the file type, the window refreshes correctly. In CFileDialog it doesn't.
My code is:
CFileDialog filedlg( FALSE, "avi", // default extension
"mip1.avi", // current file name
OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_LONGNAMES,
"All Files (*.*)|*.*|Avi Files (*.avi)|*.avi||", NULL);
Since starting to look into this problem I found out that the problem exists ONLY when I use Managed extensions. When I turn off Managed extensions, it refreshes perfectly, like it has always done.
To complete the picture I tried GetSaveFileName( &ofn) and that shows exactly the same behaviour.
Has anyone else seen this, or can tell me what is wrong?
Thanks,
Ilan
|
|
|
|
|
Hi,
I saw many different ways to convert a System::String to a char in MSDN2... But it doesn't work.
example...
private: System::Void openFileDialog1_FileOk(System::Object^ sender, System::ComponentModel::CancelEventArgs^ e) ...
I need to convert the openFileDialog1->File to a char named caminho to use this in other functions that only supports *char...
Please help-me...
|
|
|
|
|
good morning,
how about this one:
// maybe you'll have to set your project settings to UNICODE
array <Char>^ myCharArray = openFileDialog1->FileName->ToCharArray();
pin_ptr<Char> caminho = &myCharArray[0];
regards Tobias
|
|
|
|
|
How do I use the args in the "int main(array<System::String ^> ^args)" main() style?
I used to use the "argv[1]" for the "normal" "int main(int argc, char* argv[])". And I want to use the args in the "new" just like this one.
Something for "if (argv[1] != NULL)"
or for "GetShortPathNameA(argv[1], filepath, 255);"
What I have to do?
I'm new in C++... But I need to use this...
Thanks,
Leonel
(Sorry by the poor english, I'm Brazillian.)
|
|
|
|
|
Hi,
for example:
if(args->Length > 0)
{
if(args[1]) // optionally, but first check the boundaries of that array; otherwise an "array out of bounds exception" will occur
DoFoolishThings(args[1]);
}
regards Tobias
|
|
|
|
|
Hello all,
I'll start by saying the dreaded words: I am a newbie.
Started using visual studio .NET recently and I just can't seem to do anything with it. I am used to visual studio 6 c++ and I'm having difficulty with the transition.
Under .NET I have creeated a rich text box that I would like to use to display a string of text. The difficulty arises because each character within the string can have different formatting applied (bold, italic, underline). So I would like to simply step through each character within the string and output them one-by-one.
My C++ brain tells me that I would like to simply use a for_each, like this:
<br />
string s = "Hello I am a test string";<br />
for_each(s.begin(), s.end(), printValue);<br />
So can anyone explain what would be different when implementing the above functionality within .NET,
or can I still somehow write the same C++ that I am used to?
Just to give an idea, here is a code snippet
<br />
private: System::String *text_string;<br />
<br />
private: System::Void outputToScreen()<br />
{<br />
this->text_string = S"Hello I am a test string...";<br />
<br />
}<br />
Even links to relevant API support documentation would be great
Thanks for your help.
|
|
|
|
|
richiebaby wrote: Started using visual studio .NET
Witch one: 2003 or 2005. I will use 2005 syntax for samples.
richiebaby wrote: My C++ brain tells me that I would like to simply use a for_each, like this:
Your sample is wrong.
String has simular behaver like CString.
using namespace System;
using namespace System::Collections;
int main(array<System::String ^> ^args)
{
String ^s = gcnew String("Hello, I am a test String");
array <Char> ^sChars = s->ToCharArray();
IEnumerator ^myEnum = sChars->GetEnumerator();
while (myEnum->MoveNext())
{
String ^ss = (myEnum->Current->ToString());
Console::WriteLine("-{0}-", ss);
}
return 0;
}
|
|
|
|
|
Hi
Thanks for your help, but I'm afraid that I need a little more guidance.
First the answer to your question: I am using .NET 2003.
Some more info: I started a new Windows form project, I then proceeded to create a RichTextBox on the form. So setting the text is easy but I am trying change the font of individual characters within the RichTextBox(don't know if the best solution is to use RichTextBox or not).
So I figured that I would go through each char within the string, apply a font and append to the contents of the RichTextBox (not even sure if possible).
The trouble is I can't seem to get to grips with the .NET framework, I find it harder than good old C++.
Straight away I am slightly lost with your sample code, how can I take your suggested code and import it into the code that .NET has produced for me. Bearing in mind I am not within the main method but within a new that I have created.
For instance, if I have an empty method called outputToScreen(), how can I even start to use your suggested code.
<br />
private: System::Void outputToScreen()<br />
{<br />
<br />
}<br />
If I write:
<br />
private: System::Void outputToScreen(array ^args)<br />
{<br />
}<br />
Then I get "error C6201: syntax error : identifier 'array'"
These are probably dumb question but i am trying to learn, so...
Thank you.
|
|
|
|
|
richiebaby wrote: Thanks for your help, but I'm afraid that I need a little more guidance
Sure, that's whay we are here.
richiebaby wrote: First the answer to your question: I am using .NET 2003.
It was a long time ago when i used VS2003.
Some syntax diffrences betwen VS2003 and VS2005 (List is incomplete
VS2003 VS2005
new gcnew
__gc (In gc container, you don't use it)
* (pointer def.) ^
(String *sArray = new String __gc *[10]; array (defin. for ar.)
VS2003 using managed c++(obsolete syntax). VS2005 is using newer syntax called C++/CLI. Currently i have vs2005 installed, so i can't garanity, that my code is bug free.
richiebaby wrote: Straight away I am slightly lost with your sample code, how can I take your suggested code and import it into the code that .NET has produced for me. Bearing in mind I am not within the main method but within a new that I have created.
you can use it as find the position. But it is VS2005 syntax, i forgot how it look like in VS2003.
richTextBox1->Text = "Hello, World.";
richTextBox1->Select(7,5);
richTextBox1->SelectionFont = new System::Drawing::Font("Tahoma", 12, FontStyle::Bold);
richTextBox1->SelectionColor = System::Drawing::Color::Blue;
richTextBox1->DeselectAll();
You can sceep command Select(int, int), SelectAll() and DeselectAll(), if you intend to select a text with a mouse.
richiebaby wrote: The trouble is I can't seem to get to grips with the .NET framework, I find it harder than good old C++.
Because you are used to. I couldn't learn c++ (MFC and Win32) is due to an problems with converting from one to another parameter. In .NET i could Use like String::ToInt32(S"666");
|
|
|
|
|
After a bit of hacking I have found a working solution.
Many thanks to the person who posted their code.
Here is a copy of what I was trying to achieve
<br />
private: System::Void outputToScreen()<br />
{<br />
textBox->Clear();<br />
<br />
System::String *temp_text_string;<br />
<br />
text_string = S"Hello I am a test string";<br />
<br />
Array *stringArray;<br />
<br />
stringArray = text_string->ToCharArray();<br />
<br />
IEnumerator *myEnum = stringArray->GetEnumerator();<br />
<br />
while (myEnum->MoveNext())<br />
{<br />
temp_text_string = (myEnum->Current->ToString());<br />
<br />
textBox->SelectionFont = new System::Drawing::Font( "Arial",12,FontStyle::Italic );<br />
<br />
textBox->SelectedText = temp_text_string;<br />
} <br />
<br />
}<br />
So there we have it, I am much happier now that I have something to work on.
I know it's ugly but I'm happy seeing as I've only used .NET for less than 48 hours.
Thanks again
|
|
|
|
|
I have this very wierd error message in Visual C++ Express 2005:
1>.\UIEvents.cpp(252) : error C2860: 'void' cannot be an argument type, except for '(void)'
1> This diagnostic occurred while importing type 'VLCWPF::SkinInterface::PlaylistItem ' from assembly 'VLCWPF, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. Here's the offending code:
InputItem *inputitem = item->get_InputItem(); What's most wierd to me is that I can't find anywhere where this mysterious void could be coming from. The class InputItem is very simple, so I can't see why it would have problems:
public class InputItem
{
public InputItem(string name, string uri, string[] inputOptions, int id, InputInterface.InputType inputType)
{
this.name = name;
this.uri = uri;
this.inputOptions = inputOptions;
this.id = id;
this.inputType = inputType;
}
public InputItem(string name, string uri) :
this(name, uri, null, 0, InputInterface.InputType.Unknown)
{
}
public string Name
{
get { return name; }
set { name = value; }
}
public string Uri
{
get { return uri; }
set { uri = value; }
}
protected string name;
protected string uri;
protected string[] inputOptions;
protected int id;
protected InputInterface.InputType inputType;
}
Can anyone make any suggestions? I can't figure out for the life of me what could cause this.
Joel Holdsworth
|
|
|
|
|
First of all, your InputItem class looks like C#. Assuming the class is located in a C# assembly, your problematic code should look like something like this:
InputItem ^inputitem = item->get_InputItem();
The "*" is for unmanaged code.
|
|
|
|
|
George L. Jackson wrote: The "*" is for unmanaged code.
And for old Managed c++
|
|
|
|
|
I almost forgot! The "get_" in "item->get_InputItem()" may also be a problem!
|
|
|
|
|
You're using 2 different languages here. I don't know that C# has a dereference operator, except in unsafe blocks.
Thanks,
John
|
|
|
|
|
Hi All,
I am using VC++ 2005 Express and SQL Server express. The database MyDB has shown in the Data Sources panel after applying "add new data source" steps. In the MYDB, there is a table called "MyTable", which is also shown in Data Sources panel. How do I transfer data from MyTable to a DataTable ("dtTable")? I tried following codes but it didn't work.
SqlDataAdapter^ sqlAdapter;
DataTable^ dtTable;
sqlAdapter = gcnew sqlDataAdapter("select * from MyTable", "MyDB");
dtTable = gcnew DataTable("dtTable");
sqlAdapter->Fill(dtTable);
Any suggestions? Thanks in advance.
Kevin
|
|
|
|
|
I don't see any connection string or code to talk to the database!
|
|
|
|
|
Thanks George. I thought that, when a database was shown in the Data Sources panel, the connection codes were implied. I'll add connection codes and try again.
Kevin
|
|
|
|
|
Hi,
I do have the following structure in vc++
public ref struct structExample
{
int a;
char b;
float c;
};
i need to copy the array of bytes value into this structure,
Generally if the structure is not a managed type we use "memcpy()" to copy the contents into the structure.
Similarly how can be done this ,in case of managed structures
Thanks in advance
Sangeetha
|
|
|
|
|
Hi,
basically the BitConverterClass should meet your requirements. But most likely there is a more elegant way to do this.
e.g.
structExample^ strEx = gcnew structExample();
strEx->a = BitConverter::ToInt32(byteArray,indexofyourinteger);
regards Tobias
|
|
|
|
|
I need to copy the array elements into the structure on a whole at a stretch as "memcpy()" does in ummanaged code, since I do have 100 elements/members in the structure.
|
|
|
|